/ Hex Artifact Content
Login

Artifact 9bf0c1b7156cbcd2ec32e557cffa319251e1ffb1515d923a2dd2d8eee69b4ee4:


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 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
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 23 69 66 20 64 65 66  urrent)..#if def
4650: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
4660: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4670: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
4680: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b  TOMIC_WRITE).  {
4690: 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20   "ioctl",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20  ll_ptr)ioctl,   
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20  e.  { "ioctl",  
46e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
46f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4710: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4720: 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29  osIoctl ((int(*)
4730: 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  (int,int,...))aS
4740: 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72  yscall[28].pCurr
4750: 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20  ent)..}; /* End 
4760: 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61  of the overridea
4770: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
4780: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73   */.../*.** On s
4790: 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c  ome systems, cal
47a0: 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77  ls to fchown() w
47b0: 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65  ill trigger a me
47c0: 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72  ssage in a secur
47d0: 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68  ity.** log if th
47e0: 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e  ey come from non
47f0: 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e  -root processes.
4800: 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69    So avoid calli
4810: 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a  ng fchown() if.*
4820: 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e  * we are not run
4830: 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f  ning as root..*/
4840: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
4850: 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  stFchown(int fd,
4860: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
4870: 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69  t gid){.#if defi
4880: 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29  ned(HAVE_FCHOWN)
4890: 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65  .  return osGete
48a0: 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63  uid() ? 0 : osFc
48b0: 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29  hown(fd,uid,gid)
48c0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
48d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
48e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
48f0: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4900: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4910: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4920: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4930: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4940: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4950: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4960: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4970: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4980: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
4990: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
49a0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
49b0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
49c0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
49d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
49e0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
49f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4a00: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4a10: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4a20: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4a40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4a50: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4a60: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4a70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4a80: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
4a90: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
4aa0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
4ab0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
4ac0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4ad0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ae0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4af0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4b00: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4b10: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4b20: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4b30: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4b40: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4b50: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4b60: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4b70: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4b80: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
4b90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4bb0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4bc0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4bd0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
4be0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4bf0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4c00: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4c10: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4c20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4c50: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4c60: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4c70: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4c80: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
4c90: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
4ca0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
4cb0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4cc0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4cd0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4ce0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4cf0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4d00: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4d10: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4d20: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4d30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4d40: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4d50: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4d60: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4d70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4d80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4d90: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
4da0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
4db0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
4dc0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
4dd0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4de0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4df0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4e00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4e40: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4e50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4e60: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4e70: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4e80: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
4e90: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
4ea0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
4eb0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
4ec0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
4ed0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
4ee0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4ef0: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4f00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4f10: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4f20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4f30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4f40: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4f50: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4f60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4f70: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4f80: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4f90: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
4fa0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
4fb0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
4fc0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
4fd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4fe0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4ff0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5000: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
5010: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
5020: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
5030: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
5040: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
5050: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5060: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5070: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
5080: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
5090: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
50a0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
50b0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
50c0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
50d0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
50e0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
50f0: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
5100: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
5110: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
5120: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5130: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
5140: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
5150: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
5160: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5170: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
5180: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
5190: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
51a0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
51b0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
51c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
51d0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
51e0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
51f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
5200: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
5210: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
5220: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
5250: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
5260: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
5270: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
5280: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
5290: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
52a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
52b0: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
52c0: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
52d0: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
52e0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
52f0: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
5300: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
5310: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
5320: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
5330: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
5340: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
5350: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
5360: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
5370: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
5380: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
5390: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
53a0: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
53b0: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
53c0: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
53d0: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
53e0: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
53f0: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
5400: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
5410: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
5420: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
5430: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
5440: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
5450: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
5460: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
5470: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
5480: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
5490: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
54a0: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
54b0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
54c0: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
54d0: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
54e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
54f0: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
5500: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
5510: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
5520: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
5530: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
5540: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
5550: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
5560: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
5570: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
5580: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
5590: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
55a0: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
55b0: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
55c0: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
55d0: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
55e0: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
55f0: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
5600: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
5610: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
5620: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
5630: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
5640: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
5650: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
5660: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
5670: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
5680: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
5690: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
56a0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
56b0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
56c0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
56d0: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
56e0: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
56f0: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
5700: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
5710: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
5720: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
5730: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
5740: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
5750: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
5760: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
5770: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
5780: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
5790: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
57a0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
57b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
57c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
57d0: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
57e0: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
57f0: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5800: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5810: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5820: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5840: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
5850: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
5860: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
5870: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
5880: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
5890: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
58a0: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
58b0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
58c0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
58d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
58e0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
58f0: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5900: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5910: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5920: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
5930: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
5940: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
5950: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
5960: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
5970: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
5980: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
5990: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
59a0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
59b0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
59c0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
59d0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
59e0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
59f0: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5a00: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5a30: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5a40: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5a50: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5a60: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5a70: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5a80: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5a90: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
5aa0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
5ab0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
5ac0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
5ad0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
5ae0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5af0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5b00: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5b10: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5b20: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5b30: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5b40: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5b50: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5b60: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5b70: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5b80: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5b90: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
5ba0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
5bb0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
5bc0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
5bd0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
5be0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5bf0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5c00: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5c10: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5c20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5c30: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5c40: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5c50: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5c60: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5c70: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5c80: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
5c90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
5ca0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5cb0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5cc0: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
5cd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5ce0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5cf0: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5d00: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5d10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5d20: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5d30: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5d40: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5d50: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5d60: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5d70: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5d80: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
5d90: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
5da0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
5db0: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
5dc0: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
5dd0: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
5de0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5df0: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5e00: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5e10: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5e30: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5e40: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5e50: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5e60: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5e70: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5e80: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
5e90: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
5ea0: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
5eb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
5ec0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
5ed0: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
5ee0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5ef0: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5f00: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5f10: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5f20: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5f30: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5f40: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5f50: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5f60: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5f70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5f80: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
5f90: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
5fa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5fb0: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
5fc0: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
5fd0: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
5fe0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5ff0: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
6000: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
6010: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
6020: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
6030: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
6040: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
6050: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
6060: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
6070: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
6080: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
6090: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
60a0: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
60b0: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
60c0: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
60d0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
60e0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
60f0: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
6100: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
6110: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
6120: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
6130: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
6140: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
6150: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
6160: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
6170: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
6180: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
6190: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
61a0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
61b0: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
61c0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
61d0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
61e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
61f0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
6200: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
6210: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
6220: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
6230: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
6240: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
6250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6260: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
6270: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
6280: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
6290: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
62a0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
62b0: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
62c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
62d0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
62e0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
62f0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
6300: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
6310: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
6320: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
6330: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
6340: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
6350: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
6360: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
6370: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
6380: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
6390: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
63a0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
63b0: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
63c0: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
63d0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
63e0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
63f0: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
6400: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
6410: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
6420: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6430: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
6440: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
6450: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6460: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
6470: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
6480: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
6490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
64a0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
64b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
64c0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
64d0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
64e0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
64f0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
6500: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
6510: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
6520: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
6530: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
6540: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
6550: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
6560: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
6570: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
6580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
6590: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
65a0: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
65b0: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
65c0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
65d0: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
65e0: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
65f0: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
6600: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
6610: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
6620: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
6630: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
6640: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
6650: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
6660: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
6670: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
6680: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6690: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
66a0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
66b0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
66c0: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
66d0: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
66e0: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
66f0: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
6700: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
6710: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
6720: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
6730: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
6740: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
6750: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
6760: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
6770: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
6780: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
6790: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
67a0: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
67b0: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
67c0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
67d0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
67e0: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
67f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6800: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6810: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6820: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
6830: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
6840: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
6850: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6860: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6870: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
6880: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
6890: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
68a0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
68b0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
68c0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
68d0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
68e0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
68f0: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6900: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6910: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6920: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
6930: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
6940: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
6950: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
6960: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
6970: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
6980: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
6990: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
69a0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
69b0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
69c0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
69d0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
69e0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
69f0: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6a00: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6a10: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6a20: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
6a30: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
6a40: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
6a50: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
6a60: 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 28  r) {.  assert( (
6a70: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
6a80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
6a90: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6aa0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6ab0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
6ac0: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
6ad0: 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20     (sqliteIOErr 
6ae0: 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  == SQLITE_IOERR_
6af0: 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20  RDLOCK) ||.     
6b00: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6b10: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6b20: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
6b30: 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63 68  OCK) );.  switch
6b40: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
6b50: 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a    case EACCES: .
6b60: 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20    case EAGAIN:. 
6b70: 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a   case ETIMEDOUT:
6b80: 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20  .  case EBUSY:. 
6b90: 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63   case EINTR:.  c
6ba0: 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20  ase ENOLCK:  .  
6bb0: 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20    /* random NFS 
6bc0: 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c  retry error, unl
6bd0: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6be0: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6bf0: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6c00: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6c10: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6c20: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6c40: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20  TE_BUSY;.    .  
6c50: 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20  case EPERM: .   
6c60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
6c70: 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66 61  ERM;.    .  defa
6c80: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
6c90: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
6ca0: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
6d00: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
6d10: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
6d20: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
6d30: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
6d40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
6d50: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
6d60: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
6d70: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
6d80: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
6d90: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
6da0: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
6db0: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
6dc0: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
6dd0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
6de0: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
6df0: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
6e00: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
6e10: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
6e20: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
6e30: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
6e40: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
6e50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6e60: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
6e70: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
6e80: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
6e90: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
6ea0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
6eb0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
6ec0: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
6ed0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
6ee0: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
6ef0: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
6f00: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
6f10: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
6f20: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
6f30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
6f40: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
6f50: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
6f60: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
6f70: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
6f80: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
6f90: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
6fa0: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
6fb0: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
6fc0: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
6fd0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
6fe0: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
6ff0: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
7000: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
7010: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7020: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
7030: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
7040: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
7050: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
7060: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
7070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7080: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7090: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
70a0: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
70b0: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70d0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
70e0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
70f0: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
7100: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
7120: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
7130: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
7140: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
7150: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
7160: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
7170: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
7180: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
7190: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
71a0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
71b0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
71c0: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
71d0: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
71e0: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
71f0: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
7200: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
7210: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
7220: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
7230: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
7240: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
7250: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
7260: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
7270: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
7280: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
7290: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
72a0: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
72b0: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
72c0: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
72d0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
72e0: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
72f0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
7300: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
7310: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
7320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7330: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
7340: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
7350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7360: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
7370: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
7380: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
7390: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
73a0: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
73b0: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
73c0: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
73d0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
73e0: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
73f0: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
7400: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
7410: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7420: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
7430: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
7440: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
7450: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7460: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
7470: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
7480: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
7490: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
74a0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
74b0: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
74c0: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
74d0: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
74e0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
74f0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7500: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
7520: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
7530: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
7540: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
7550: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
7560: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
7570: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
7580: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
7590: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
75a0: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
75b0: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
75c0: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
75d0: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
75e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
75f0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
7600: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
7610: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
7620: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
7630: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
7640: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
7650: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
7660: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
7670: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
7680: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
7690: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
76a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
76b0: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
76c0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
76d0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
76e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
76f0: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
7700: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
7710: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
7720: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7730: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
7740: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
7750: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
7760: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
7770: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
7780: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
7790: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
77a0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
77b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
77e0: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
77f0: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
7800: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
7810: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
7820: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
7830: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
7840: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
7850: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
7860: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
7870: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
7880: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7890: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
78a0: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
78b0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
78c0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
78d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
78e0: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
78f0: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
7900: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
7910: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7920: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
7930: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
7940: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
7950: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
7960: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
7970: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
7980: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7990: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
79a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
79b0: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
79c0: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
79d0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
79e0: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
79f0: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
7a00: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
7a10: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
7a20: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
7a30: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
7a40: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
7a50: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
7a60: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
7a70: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
7a80: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
7a90: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
7aa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7ab0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
7ac0: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
7ad0: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
7ae0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
7af0: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
7b00: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
7b10: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
7b20: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
7b30: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
7b40: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
7b50: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
7b60: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
7b70: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
7b80: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
7b90: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
7ba0: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
7bb0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
7bc0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7bd0: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
7be0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7bf0: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
7c00: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
7c10: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
7c20: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
7c30: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
7c40: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
7c50: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
7c60: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
7c70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7c80: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
7c90: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
7ca0: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
7cb0: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
7cc0: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
7cd0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
7ce0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7cf0: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
7d00: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
7d10: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
7d20: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
7d30: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
7d40: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
7d50: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
7d60: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
7d70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
7d80: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
7d90: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
7da0: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
7db0: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
7dc0: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
7dd0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
7de0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
7df0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
7e00: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
7e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ea0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
7ed0: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
7f00: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
7f10: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
7f20: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
7f30: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
7f40: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
7f50: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
7f60: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
7f70: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
7f80: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
7f90: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
7fa0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
7fb0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
7fc0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
7fd0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7fe0: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
7ff0: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
8000: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
8010: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
8020: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
8030: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
8040: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
8050: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
8060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
8070: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
8080: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
8090: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
80a0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
80b0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
80c0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
80d0: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
80e0: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
80f0: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
8100: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
8110: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
8120: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
8130: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
8140: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
8150: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
8160: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
8170: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
8180: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
8190: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
81a0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
81b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
81c0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
81d0: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
81e0: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
81f0: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
8200: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
8210: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
8220: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
8230: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
8240: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
8250: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
8260: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
8270: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
8280: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
8290: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
82a0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
82b0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
82c0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
82d0: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
82e0: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
82f0: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
8300: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
8310: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
8320: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
8330: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
8340: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
8350: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
8360: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8370: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
8380: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
8390: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
83a0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
83b0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
83c0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
83d0: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
83e0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
83f0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
8400: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
8410: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
8420: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
8430: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
8440: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
8450: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
8460: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
8470: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
8480: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
8490: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
84a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
84b0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
84c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
84d0: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
84e0: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
84f0: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
8500: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
8510: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
8520: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
8530: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
8540: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
8550: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
8560: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
8570: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
8580: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
8590: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
85a0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
85b0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
85c0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
85d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
85e0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
85f0: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
8600: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
8610: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
8620: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
8630: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
8640: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
8650: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
8660: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
8670: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
8680: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
8690: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
86a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
86b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
86c0: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
86d0: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
86e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
86f0: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
8700: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
8710: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
8720: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
8730: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
8740: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
8750: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
8760: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
8770: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
8780: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
8790: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
87a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
87b0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
87c0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
87d0: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
87e0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
87f0: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
8800: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
8810: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
8820: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
8830: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
8840: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
8850: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
8860: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
8870: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
8880: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
8890: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
88a0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
88b0: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
88c0: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
88d0: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
88e0: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
88f0: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
8900: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
8910: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
8920: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
8930: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
8940: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
8950: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
8960: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
8970: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
8980: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
8990: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
89a0: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
89b0: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
89c0: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
89d0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
89e0: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
89f0: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
8a00: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
8a10: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
8a20: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8a30: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
8a40: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
8a50: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
8a60: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
8a70: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
8a80: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
8a90: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
8aa0: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
8ab0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
8ac0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
8ad0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
8ae0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
8af0: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
8b00: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
8b10: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
8b20: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
8b30: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
8b40: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
8b50: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
8b60: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
8b70: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
8b80: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
8b90: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
8ba0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8bb0: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
8bc0: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
8bd0: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
8be0: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
8bf0: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
8c00: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
8c10: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
8c20: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
8c30: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
8c40: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
8c50: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
8c60: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
8c70: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
8c80: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
8c90: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
8ca0: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
8cb0: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
8cc0: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
8cd0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8ce0: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
8cf0: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
8d00: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
8d10: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
8d20: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
8d30: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
8d40: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
8d50: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
8d60: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
8d70: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
8d80: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
8d90: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
8da0: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
8db0: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
8dc0: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
8dd0: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
8de0: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
8df0: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
8e00: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
8e10: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
8e20: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
8e30: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
8e40: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
8e50: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
8e60: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
8e70: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
8e80: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
8e90: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
8ea0: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
8eb0: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
8ec0: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
8ed0: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
8ee0: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
8ef0: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
8f00: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
8f10: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8f20: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
8f30: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
8f40: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
8f50: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
8f60: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
8f70: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
8f80: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
8f90: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
8fa0: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
8fb0: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
8fc0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
8fd0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8fe0: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
8ff0: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
9000: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
9010: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
9020: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
9030: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
9040: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
9050: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
9060: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
9070: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
9080: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
9090: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
90a0: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
90b0: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
90c0: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
90d0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
90e0: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
90f0: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
9100: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
9110: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
9120: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
9130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
9140: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
9150: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
9160: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
9170: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
9180: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
9190: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
91a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
91b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
91c0: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
91d0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
91e0: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
91f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9200: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
9210: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
9220: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
9240: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
9250: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
9260: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9270: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
9280: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
9290: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
92a0: 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65 20  lse.  /* We are 
92b0: 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20 76  told that some v
92c0: 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72 6f  ersions of Andro
92d0: 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  id contain a bug
92e0: 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65 73   that.  ** sizes
92f0: 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20 33   ino_t at only 3
9300: 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20 6f  2-bits instead o
9310: 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65 0a  f 64-bits. (See.
9320: 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e 64    ** https://and
9330: 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f 67  roid-review.goog
9340: 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f 63  lesource.com/#/c
9350: 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f 73  /115351/3/dist/s
9360: 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20 54  qlite3.c).  ** T
9370: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
9380: 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  is, always alloc
9390: 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72 20  ate 64-bits for 
93a0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
93b0: 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61 6c  .  .  ** On smal
93c0: 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74 20  l machines that 
93d0: 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69 74  only have 32-bit
93e0: 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77 61   inodes, this wa
93f0: 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20 20  stes 4 bytes,.  
9400: 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f 75  ** but that shou
9410: 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67 20  ld not be a big 
9420: 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57 41  deal. */.  /* WA
9430: 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20  S:  ino_t ino;  
9440: 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20 20   */.  u64 ino;  
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
9470: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9480: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
9490: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
94a0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
94b0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
94c0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
94d0: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
94e0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
94f0: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9500: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9510: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9520: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
9530: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
9540: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
9550: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
9560: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
9570: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
9580: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
9590: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
95a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
95b0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
95c0: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
95d0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
95e0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
95f0: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9600: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9610: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9620: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9630: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9640: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9650: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
9660: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
9670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9680: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
9690: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
96a0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
96b0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
96c0: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
96d0: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
96e0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
96f0: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9700: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9710: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9720: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
9730: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9760: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
9770: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
9780: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
9790: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
97a0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
97b0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
97c0: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
97d0: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9800: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9810: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9820: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
9830: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
9840: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
9850: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
9860: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9870: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
9880: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
9890: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
98a0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
98b0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
98c0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
98d0: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
98e0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
98f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9900: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9910: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9920: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
9930: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
9940: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
9950: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
9960: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
9970: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
9980: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
9990: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
99a0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
99b0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
99c0: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
99d0: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
99e0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
99f0: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
9a00: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9a10: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
9a20: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
9a30: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
9a40: 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49 6e  ;  /* All unixIn
9a50: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9a60: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
9a70: 65 64 20 69 6e 74 20 6e 55 6e 75 73 65 64 46 64  ed int nUnusedFd
9a80: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74 61   = 0;    /* Tota
9a90: 6c 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  l unused file de
9aa0: 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f 2a  scriptors */../*
9ab0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9ac0: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
9ad0: 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73 20  rorAtLine(), is 
9ae0: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
9af0: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
9b00: 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29  * unixLogError()
9b10: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  ..**.** It is in
9b20: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
9b30: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
9b40: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e  n OS function an
9b50: 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e  d errno has been
9b60: 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73  .** set. It logs
9b70: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
9b80: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
9b90: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
9ba0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
9bb0: 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20  * errno and, if 
9bc0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
9bd0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
9be0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72  ivalent from str
9bf0: 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74  error() or.** st
9c00: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a  rerror_r()..**.*
9c10: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
9c20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
9c30: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
9c40: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
9c50: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
9c60: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
9c70: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
9c80: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
9c90: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
9ca0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
9cb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
9cc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
9cd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
9ce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
9cf0: 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75   failed (e.g. "u
9d00: 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20  nlink", "open") 
9d10: 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
9d20: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
9d30: 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a  ath,.** if any..
9d40: 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c  */.#define unixL
9d50: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20  ogError(a,b,c)  
9d60: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
9d70: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49  tLine(a,b,c,__LI
9d80: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
9d90: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9da0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
9db0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
9dc0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
9dd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
9de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
9df0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
9e00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
9e10: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
9e20: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
9e30: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
9e50: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
9e60: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
9e70: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
9ea0: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
9eb0: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
9ec0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20  {.  char *zErr; 
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66      /* Message f
9ef0: 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f  rom strerror() o
9f00: 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a  r equivalent */.
9f10: 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65    int iErrno = e
9f20: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
9f30: 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61    /* Saved sysca
9f40: 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20  ll error number 
9f50: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  */..  /* If this
9f60: 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64   is not a thread
9f70: 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49  safe build (SQLI
9f80: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30  TE_THREADSAFE==0
9f90: 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a  ), then use.  **
9fa0: 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29 20   the strerror() 
9fb0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  function to obta
9fc0: 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  in the human-rea
9fd0: 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  dable error mess
9fe0: 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c  age.  ** equival
9ff0: 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74  ent to errno. Ot
a000: 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74 72  herwise, use str
a010: 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20  error_r()..  */ 
a020: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
a030: 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65  ADSAFE && define
a040: 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f  d(HAVE_STRERROR_
a050: 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38  R).  char aErr[8
a060: 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72  0];.  memset(aEr
a070: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72  r, 0, sizeof(aEr
a080: 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45  r));.  zErr = aE
a090: 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52  rr;..  /* If STR
a0a0: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28  ERROR_R_CHAR_P (
a0b0: 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20  set by autoconf 
a0c0: 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53  scripts) or __US
a0d0: 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64  E_GNU is defined
a0e0: 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68  ,.  ** assume th
a0f0: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72  at the system pr
a100: 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20 76  ovides the GNU v
a110: 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72  ersion of strerr
a120: 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a  or_r() that.  **
a130: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
a140: 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
a150: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72  ontaining the er
a160: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61  ror message. Tha
a170: 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20  t pointer .  ** 
a180: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72  may point to aEr
a190: 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  r[], or it may p
a1a0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61  oint to some sta
a1b0: 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65  tic storage some
a1c0: 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68  where. .  ** Oth
a1d0: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74  erwise, assume t
a1e0: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
a1f0: 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53 49  rovides the POSI
a200: 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20  X version of .  
a210: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c  ** strerror_r(),
a220: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77 72   which always wr
a230: 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ites an error me
a240: 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b  ssage into aErr[
a250: 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  ]..  **.  ** If 
a260: 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65  the code incorre
a270: 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61  ctly assumes tha
a280: 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53 49  t it is the POSI
a290: 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69  X version that i
a2a0: 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
a2b0: 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  , the error mess
a2c0: 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62  age will often b
a2d0: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
a2e0: 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75  g. Not a.  ** hu
a2f0: 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f  ge problem. Inco
a300: 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69  rrectly concludi
a310: 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55 20  ng that the GNU 
a320: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
a330: 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64  able .  ** could
a340: 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66 61   lead to a segfa
a350: 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f  ult though..  */
a360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54 52  .#if defined(STR
a370: 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20  ERROR_R_CHAR_P) 
a380: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45  || defined(__USE
a390: 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a  _GNU).  zErr = .
a3a0: 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72  # endif.  strerr
a3b0: 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72  or_r(iErrno, aEr
a3c0: 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d  r, sizeof(aErr)-
a3d0: 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54  1);..#elif SQLIT
a3e0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f  E_THREADSAFE.  /
a3f0: 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72 65  * This is a thre
a400: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75  adsafe build, bu
a410: 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69  t strerror_r() i
a420: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
a430: 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b   */.  zErr = "";
a440: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d  .#else.  /* Non-
a450: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
a460: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28 29  , use strerror()
a470: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74  . */.  zErr = st
a480: 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a  rerror(iErrno);.
a490: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a 50  #endif..  if( zP
a4a0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
a4b0: 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c   "";.  sqlite3_l
a4c0: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
a4d0: 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a    "os_unix.c:%d:
a4e0: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
a4f0: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
a500: 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20   iErrno, zFunc, 
a510: 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b  zPath, zErr.  );
a520: 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f  ..  return errco
a530: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  de;.}../*.** Clo
a540: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
a550: 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ptor..**.** We a
a560: 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65  ssume that close
a570: 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  () almost always
a580: 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74   works, since it
a590: 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a   is only in a.**
a5a0: 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69   very sick appli
a5b0: 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76  cation or on a v
a5c0: 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72  ery sick platfor
a5d0: 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  m that it might 
a5e0: 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64  fail..** If it d
a5f0: 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79  oes fail, simply
a600: 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64   leak the file d
a610: 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64  escriptor, but d
a620: 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72  o log the.** err
a630: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  or..**.** Note t
a640: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
a650: 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73  fe to retry clos
a660: 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52 20  e() after EINTR 
a670: 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c  since the.** fil
a680: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67  e descriptor mig
a690: 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ht have already 
a6a0: 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20 61  been reused by a
a6b0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a  nother thread..*
a6c0: 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76  * So we don't ev
a6d0: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65  en try to recove
a6e0: 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e  r from an EINTR.
a6f0: 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65    Just log the e
a700: 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65  rror.** and move
a710: 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   on..*/.static v
a720: 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  oid robust_close
a730: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
a740: 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e  , int h, int lin
a750: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c  eno){.  if( osCl
a760: 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e  ose(h) ){.    un
a770: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a780: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
a790: 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20  OSE, "close",.  
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69       pFile ? pFi
a7c0: 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c  le->zPath : 0, l
a7d0: 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ineno);.  }.}../
a7e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46 69  *.** Set the pFi
a7f0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20  le->lastErrno.  
a800: 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  Do this in a sub
a810: 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74 20  routine as that 
a820: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f  provides.** a co
a830: 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
a840: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
a850: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
a860: 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  id storeLastErrn
a870: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
a880: 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20  e, int error){. 
a890: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a8a0: 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  o = error;.}../*
a8b0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69  .** Close all fi
a8c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61  le descriptors a
a8d0: 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65  ccumuated in the
a8e0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e   unixInodeInfo->
a8f0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
a900: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c   .static void cl
a910: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e  osePendingFds(un
a920: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
a930: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
a940: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
a950: 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
a960: 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e  nusedFd *p;.  Un
a970: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
a980: 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64  t;.  for(p=pInod
a990: 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70  e->pUnused; p; p
a9a0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
a9b0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
a9c0: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
a9d0: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
a9e0: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
a9f0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
aa00: 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20    nUnusedFd--;. 
aa10: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
aa20: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
aa30: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
aa40: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
aa50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
aa60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
aa70: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
aa80: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
aa90: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
aaa0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
aab0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
aac0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
aad0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
aae0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
aaf0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
ab00: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
ab10: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
ab20: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
ab30: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
ab40: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
ab50: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
ab60: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
ab70: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
ab80: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
ab90: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
aba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
abb0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
abc0: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
abd0: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
abe0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
abf0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
ac00: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
ac10: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
ac20: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
ac30: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
ac40: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
ac50: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
ac60: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
ac70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ac80: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
ac90: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
aca0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
acb0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
acc0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
acd0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
ace0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
acf0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
ad00: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
ad10: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
ad20: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
ad30: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
ad40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ad50: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
ad60: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
ad70: 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c   inodeList!=0 ||
ad80: 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b   nUnusedFd==0 );
ad90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
ada0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
adb0: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
adc0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
add0: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
ade0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
adf0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
ae00: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
ae10: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
ae20: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
ae30: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
ae40: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
ae50: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
ae60: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
ae70: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
ae80: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
ae90: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
aea0: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
aeb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
aec0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
aed0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
aee0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
aef0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
af00: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
af10: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
af20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
af30: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
af40: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
af50: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
af60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
af70: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
af80: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
af90: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
afa0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
afb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
afc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
afd0: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
afe0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
aff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b000: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b010: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
b020: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
b030: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
b040: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
b050: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
b060: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
b070: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
b080: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
b090: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
b0a0: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
b0b0: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
b0c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
b0d0: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
b0e0: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
b0f0: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
b100: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
b110: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
b120: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
b130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
b140: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
b150: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
b160: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
b170: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
b180: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
b190: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
b1a0: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
b1b0: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
b1c0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
b1d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
b1e0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64  e, errno);.#if d
b1f0: 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57  efined(EOVERFLOW
b200: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
b210: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29  ITE_DISABLE_LFS)
b220: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
b230: 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52  lastErrno==EOVER
b240: 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51  FLOW ) return SQ
b250: 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64  LITE_NOLFS;.#end
b260: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
b270: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
b280: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
b290: 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f  _.  /* On OS X o
b2a0: 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73  n an msdos files
b2b0: 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65  ystem, the inode
b2c0: 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72   number is repor
b2d0: 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65  ted.  ** incorre
b2e0: 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69  ctly for zero-si
b2f0: 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74  ze files.  See t
b300: 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f  icket #3260.  To
b310: 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e   work.  ** aroun
b320: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  d this problem (
b330: 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61  we consider it a
b340: 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f   bug in OS X, no
b350: 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77  t SQLite).  ** w
b360: 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73  e always increas
b370: 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
b380: 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20  to 1 by writing 
b390: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
b3a0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65  ** prior to acce
b3b0: 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20  ssing the inode 
b3c0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65  number.  The one
b3d0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73   byte written is
b3e0: 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27  .  ** an ASCII '
b3f0: 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69  S' character whi
b400: 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20  ch also happens 
b410: 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
b420: 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  byte.  ** in the
b430: 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79   header of every
b440: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
b450: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
b460: 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  if there.  ** is
b470: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
b480: 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74  n such that anot
b490: 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61  her thread has a
b4a0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
b4b0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
b4c0: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
b4d0: 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20  base, no damage 
b4e0: 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  is done..  */.  
b4f0: 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73  if( statbuf.st_s
b500: 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65  ize==0 && (pFile
b510: 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  ->fsFlags & SQLI
b520: 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
b530: 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64  DOS)!=0 ){.    d
b540: 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28  o{ rc = osWrite(
b550: 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68  fd, "S", 1); }wh
b560: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
b570: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
b580: 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20   if( rc!=1 ){.  
b590: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
b5a0: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
b5b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b5c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
b5d0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73   }.    rc = osFs
b5e0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
b5f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
b600: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
b610: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b620: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
b630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b640: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
b650: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
b660: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
b670: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
b680: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
b690: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
b6a0: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
b6b0: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
b6c0: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
b6d0: 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73 74  Id.ino = (u64)st
b6e0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
b6f0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 69  ndif.  assert( i
b700: 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e  nodeList!=0 || n
b710: 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a 20  UnusedFd==0 );. 
b720: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
b730: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
b740: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
b750: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
b760: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
b770: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
b780: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
b790: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
b7a0: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
b7b0: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
b7c0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
b7d0: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
b7e0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
b7f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
b800: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
b810: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
b820: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
b830: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
b840: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
b850: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b860: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
b870: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
b880: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
b890: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
b8a0: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
b8b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
b8c0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
b8d0: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
b8e0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
b8f0: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
b900: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
b910: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
b920: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
b930: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
b940: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
b950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b960: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
b970: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
b980: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
b990: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
b9a0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
b9b0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
b9c0: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
b9d0: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
b9e0: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
b9f0: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
ba00: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
ba10: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
ba20: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
ba30: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
ba40: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
ba50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
ba60: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
ba70: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
ba80: 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20 20  buf)!=0 .       
ba90: 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73 74    || (u64)buf.st
baa0: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
bab0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
bac0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
bad0: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
bae0: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
baf0: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
bb00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
bb10: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
bb20: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
bb30: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
bb40: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
bb50: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
bb60: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
bb70: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
bb80: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
bb90: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
bba0: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
bbb0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
bbc0: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
bbd0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
bbe0: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
bbf0: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
bc00: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
bc10: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
bc20: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
bc30: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 73  t rc;..  /* Thes
bc40: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
bc50: 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20 6d  occurs for the m
bc60: 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  ain database onl
bc70: 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  y */.  if( pFile
bc80: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bc90: 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 20  IXFILE_NOLOCK ) 
bca0: 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d 20  return;..  rc = 
bcb0: 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  osFstat(pFile->h
bcc0: 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72  , &buf);.  if( r
bcd0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c!=0 ){.    sqli
bce0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
bcf0: 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20  ARNING, "cannot 
bd00: 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73  fstat db file %s
bd10: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
bd20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bd30: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
bd40: 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  link==0 ){.    s
bd50: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
bd60: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65  E_WARNING, "file
bd70: 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20   unlinked while 
bd80: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
bd90: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
bda0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
bdb0: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29  buf.st_nlink>1 )
bdc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
bdd0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
bde0: 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b  , "multiple link
bdf0: 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20  s to file: %s", 
be00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
be10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
be20: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
be30: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
be40: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
be50: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
be60: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
be70: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
be80: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
be90: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  turn;.  }.}.../*
bea0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
beb0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
bec0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
bed0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
bee0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
bef0: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
bf00: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
bf10: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
bf20: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
bf30: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
bf40: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
bf50: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
bf60: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
bf70: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
bf80: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
bf90: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
bfa0: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
bfb0: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
bfc0: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
bfd0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
bfe0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
bff0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c000: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
c010: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c020: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
c030: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
c040: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
c050: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
c060: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
c070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c080: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
c090: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
c0a0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
c0b0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
c0c0: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
c0d0: 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e  LOCK );.  unixEn
c0e0: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
c0f0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
c100: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
c110: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
c120: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
c130: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
c140: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
c150: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
c160: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
c170: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
c180: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c190: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
c1a0: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
c1b0: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
c1c0: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
c1d0: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
c1e0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
c1f0: 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20  f( !reserved && 
c200: 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  !pFile->pInode->
c210: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a  bProcessLock ){.
c220: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
c230: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
c240: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
c250: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
c260: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
c270: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
c280: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
c290: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
c2a0: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73  RLCK;.    if( os
c2b0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c2c0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20  F_GETLK, &lock) 
c2d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c2e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
c2f0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
c300: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
c310: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
c320: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
c330: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
c340: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
c350: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
c360: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c370: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
c380: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
c390: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
c3a0: 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22   %d %d (unix)\n"
c3b0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
c3c0: 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a  reserved));..  *
c3d0: 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
c3e0: 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
c3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
c400: 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65  t to set a syste
c410: 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  m-lock on the fi
c420: 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c  le pFile.  The l
c430: 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72  ock is .** descr
c440: 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a  ibed by pLock..*
c450: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c  *.** If the pFil
c460: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
c470: 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69  d/write from uni
c480: 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65  x-excl, then the
c490: 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76   only lock.** ev
c4a0: 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61  er obtained is a
c4b0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
c4c0: 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61  , and it is obta
c4d0: 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  ined exactly onc
c4e0: 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  e.** the first t
c4f0: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
c500: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20  attempted.  All 
c510: 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65  subsequent syste
c520: 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65  m locking.** ope
c530: 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e  rations become n
c540: 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20  o-ops.  Locking 
c550: 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c  operations still
c560: 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c   happen internal
c570: 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ly,.** in order 
c580: 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63  to coordinate ac
c590: 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70  cess between sep
c5a0: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63  arate database c
c5b0: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69  onnections.** wi
c5c0: 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  thin this proces
c5d0: 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68  s, but all of th
c5e0: 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  at is handled in
c5f0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a   memory and the.
c600: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
c610: 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72  tem does not par
c620: 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ticipate..**.** 
c630: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c640: 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20   a pass-through 
c650: 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b  to fcntl(F_SETLK
c660: 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73  ) if pFile is us
c670: 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f  ing.** any VFS o
c680: 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d  ther than "unix-
c690: 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c  excl" or if pFil
c6a0: 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22  e is opened on "
c6b0: 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e  unix-excl".** an
c6c0: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  d is read-only..
c6d0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
c6e0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61  turned if the ca
c6f0: 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63  ll completes suc
c700: 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31  cessfully, or -1
c710: 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f   if a call.** to
c720: 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20   fcntl() fails. 
c730: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72  In this case, er
c740: 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f  rno is set appro
c750: 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e  priately (by fcn
c760: 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tl())..*/.static
c770: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63   int unixFileLoc
c780: 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
c790: 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  e, struct flock 
c7a0: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
c7b0: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
c7c0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
c7d0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
c7e0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
c7f0: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
c800: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
c810: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74    if( (pFile->ct
c820: 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46  rlFlags & (UNIXF
c830: 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c  ILE_EXCL|UNIXFIL
c840: 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58  E_RDONLY))==UNIX
c850: 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20  FILE_EXCL ){.   
c860: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
c870: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
c880: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
c890: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
c8a0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
c8b0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
c8c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
c8d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
c8e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c8f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
c900: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
c910: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
c920: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
c930: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
c940: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
c950: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c960: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
c970: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
c980: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
c990: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
c9a0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
c9b0: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
c9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c9d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
c9e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  se{.    rc = osF
c9f0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
ca00: 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a  _SETLK, pLock);.
ca10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ca20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
ca30: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
ca40: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
ca50: 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
ca60: 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
ca70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ca80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
ca90: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
caa0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
cab0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
cac0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
cad0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
cae0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
caf0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
cb00: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
cb10: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
cb20: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
cb30: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
cb40: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
cb50: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
cb60: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
cb70: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
cb80: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
cb90: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
cba0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
cbb0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
cbc0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
cbd0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
cbe0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
cbf0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
cc00: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
cc10: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
cc20: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
cc30: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
cc40: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
cc50: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
cc60: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
cc70: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
cc80: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
cc90: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
cca0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
ccb0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
ccc0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
ccd0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
cce0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
ccf0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
cd00: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
cd10: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
cd20: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
cd30: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
cd40: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
cd50: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69  nt unixLock(sqli
cd60: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
cd70: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
cd80: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
cd90: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
cda0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
cdb0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
cdc0: 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b  ks and.  ** lock
cdd0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20   transitions in 
cde0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53  terms of the POS
cdf0: 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72  IX advisory shar
ce00: 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  ed and exclusive
ce10: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69  .  ** lock primi
ce20: 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65  tives (called re
ce30: 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69  ad-locks and wri
ce40: 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20  te-locks below, 
ce50: 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f  to avoid.  ** co
ce60: 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c  nfusion with SQL
ce70: 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e  ite lock names).
ce80: 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20   The algorithms 
ce90: 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a  are complicated.
cea0: 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e    ** slightly in
ceb0: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d   order to be com
cec0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 57 69 6e  patible with Win
ced0: 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20 73  dows95 systems s
cee0: 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20  imultaneously.  
cef0: 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ** accessing the
cf00: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
cf10: 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61  ile, in case tha
cf20: 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72  t is ever requir
cf30: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79  ed..  **.  ** Sy
cf40: 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e  mbols defined in
cf50: 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20   os.h indentify 
cf60: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
cf70: 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65  e' and the 'rese
cf80: 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c  rved.  ** byte',
cf90: 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74   each single byt
cfa0: 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e  es at well known
cfb0: 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68   offsets, and th
cfc0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
cfd0: 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61   ** range', a ra
cfe0: 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73  nge of 510 bytes
cff0: 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e   at a well known
d000: 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20   offset..  **.  
d010: 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53  ** To obtain a S
d020: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65  HARED lock, a re
d030: 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad-lock is obtai
d040: 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ned on the 'pend
d050: 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20  ing.  ** byte'. 
d060: 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63   If this is succ
d070: 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65 64 20  essful, 'shared 
d080: 62 79 74 65 20 72 61 6e 67 65 27 20 69 73 20 72  byte range' is r
d090: 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a 2a 20  ead-locked.  ** 
d0a0: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
d0b0: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
d0c0: 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20 28 4c  e' released.  (L
d0d0: 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57 68 65  egacy note:  Whe
d0e0: 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 61  n.  ** SQLite wa
d0f0: 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f 70 65  s first develope
d100: 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73  d, Windows95 sys
d110: 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c 6c 20  tems were still 
d120: 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20 20 2a  very common,.  *
d130: 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39 35 20  * and Widnows95 
d140: 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64 2d 6c  lacks a shared-l
d150: 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79 2e 20  ock capability. 
d160: 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35   So on Windows95
d170: 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  , a.  ** single 
d180: 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
d190: 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20 27 73  d by from the 's
d1a0: 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65  hared byte range
d1b0: 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  ' is locked..  *
d1c0: 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73 20 6e  * Windows95 is n
d1d0: 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68 20 65  ow pretty much e
d1e0: 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68 69 73  xtinct, but this
d1f0: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66 6f 72   work-around for
d200: 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b 20 6f   the.  ** lack o
d210: 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73 20 6f  f shared-locks o
d220: 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69 76 65  n Windows95 live
d230: 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b 77 61  s on, for backwa
d240: 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69  rds.  ** compati
d250: 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a 20 20  bility.).  **.  
d260: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
d270: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
d280: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
d290: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
d2a0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
d2b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
d2c0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
d2d0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
d2e0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
d2f0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
d300: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
d310: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
d320: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
d330: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
d340: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
d350: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
d360: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d370: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
d380: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
d390: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
d3a0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
d3b0: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
d3c0: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
d3d0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
d3e0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
d3f0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
d400: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
d410: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
d420: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
d430: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
d440: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
d450: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
d460: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
d470: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
d480: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
d490: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
d4a0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
d4b0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
d4c0: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
d4d0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
d4e0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
d4f0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
d500: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
d510: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
d520: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
d530: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
d540: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
d550: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
d560: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
d570: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
d580: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
d590: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
d5a0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
d5b0: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
d5c0: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
d5d0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
d5e0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
d5f0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
d600: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a 20 20  tabase. .  */.  
d610: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d620: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
d630: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d640: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
d650: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
d660: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
d670: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
d680: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
d690: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
d6a0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
d6b0: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
d6c0: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
d6d0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
d6e0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d6f0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
d700: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
d710: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
d720: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
d730: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
d740: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
d750: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
d760: 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
d770: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
d780: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
d790: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
d7a0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
d7b0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
d7c0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
d7d0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
d7e0: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
d7f0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
d800: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
d810: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
d820: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
d830: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
d840: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
d850: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
d860: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
d870: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
d880: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
d890: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
d8a0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
d8b0: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
d8c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d8d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
d8e0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
d8f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
d900: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
d910: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
d920: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
d930: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
d940: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
d950: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
d960: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
d970: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
d980: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
d990: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
d9a0: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
d9b0: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
d9c0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
d9d0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
d9e0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d9f0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
da00: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
da10: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
da20: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
da30: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
da40: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
da50: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
da60: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
da70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
da80: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
da90: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
daa0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
dab0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
dac0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
dad0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
dae0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
daf0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
db00: 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
db10: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
db20: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
db30: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
db40: 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
db50: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
db60: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
db70: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
db80: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
db90: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
dba0: 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
dbb0: 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
dbc0: 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
dbd0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
dbe0: 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
dbf0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
dc00: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
dc10: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
dc20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
dc30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
dc40: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
dc50: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
dc60: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
dc70: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
dc80: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
dc90: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
dca0: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
dcb0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
dcc0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
dcd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
dce0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
dcf0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
dd00: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
dd10: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
dd20: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
dd30: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dd40: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
dd50: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
dd60: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dd70: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
dd80: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
dd90: 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
dda0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
ddb0: 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
ddc0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
ddd0: 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
dde0: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
ddf0: 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
de00: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
de10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
de20: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
de30: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
de40: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
de50: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
de60: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
de70: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
de80: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
de90: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
dea0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
deb0: 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
dec0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
ded0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
dee0: 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
def0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
df00: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
df10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
df20: 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
df30: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
df40: 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
df50: 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
df60: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
df70: 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
df80: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
df90: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
dfa0: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
dfb0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
dfc0: 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
dfd0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
dfe0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
dff0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e000: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e010: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
e020: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
e030: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
e040: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
e050: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
e060: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
e070: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
e080: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
e090: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
e0a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
e0b0: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
e0c0: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
e0d0: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
e0e0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
e0f0: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
e100: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
e110: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
e120: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
e130: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
e140: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e150: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e160: 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
e170: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e180: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
e190: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
e1a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
e1b0: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
e1c0: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
e1d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e1e0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e1f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
e200: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
e210: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e220: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e230: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
e240: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e250: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e260: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e270: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e280: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
e290: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  }..    /* Drop t
e2a0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
e2b0: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
e2c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e2d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
e2e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
e2f0: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
e300: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e310: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e320: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e330: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
e340: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  K ){.      /* Th
e350: 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20  is could happen 
e360: 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d  with a network m
e370: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45  ount */.      tE
e380: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e390: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3a0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20  IOERR_UNLOCK; . 
e3b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
e3c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
e3d0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e3e0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e3f0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e400: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e410: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
e420: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
e430: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
e440: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
e450: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
e460: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
e470: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
e480: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
e490: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
e4a0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e4b0: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
e4c0: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
e4d0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
e4e0: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
e4f0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
e500: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
e510: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
e520: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
e530: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
e540: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
e550: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e570: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
e580: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
e590: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e5a0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
e5b0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
e5c0: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
e5d0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
e5e0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
e5f0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
e600: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
e610: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e620: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
e630: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
e640: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
e650: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e660: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
e670: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e680: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
e690: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
e6a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
e6b0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
e6c0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
e6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
e6e0: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
e6f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
e700: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
e710: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e720: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e740: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e750: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e760: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e770: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e780: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e790: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e7a0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e7b0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e7c0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e7d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e7e0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e7f0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e800: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a  }.    }.  }.  ..
e810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e820: 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  BUG.  /* Set up 
e830: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d  the transaction-
e840: 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63  counter change c
e850: 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68  hecking flags wh
e860: 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69  en.  ** transiti
e870: 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41  oning from a SHA
e880: 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56 45  RED to a RESERVE
e890: 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61  D lock.  The cha
e8a0: 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48  nge.  ** from SH
e8b0: 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
e8c0: 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e   marks the begin
e8d0: 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c  ning of a normal
e8e0: 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72  .  ** write oper
e8f0: 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74  ation (not a hot
e900: 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63   journal rollbac
e910: 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  k)..  */.  if( r
e920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
e930: 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
e940: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
e950: 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  .   && eFileLock
e960: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ==RESERVED_LOCK.
e970: 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e    ){.    pFile->
e980: 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
e990: 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62  0;.    pFile->db
e9a0: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
e9b0: 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
e9c0: 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65  rite = 1;.  }.#e
e9d0: 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d  ndif...  if( rc=
e9e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e9f0: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
ea00: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
ea10: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
ea20: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
ea30: 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  k;.  }else if( e
ea40: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
ea50: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
ea60: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ea70: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
ea80: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
ea90: 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
eaa0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
eab0: 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
eac0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
ead0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
eae0: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
eaf0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
eb00: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
eb10: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
eb20: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
eb30: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
eb40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
eb50: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
eb60: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
eb70: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
eb80: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
eb90: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
eba0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
ebb0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
ebc0: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
ebd0: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
ebe0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
ebf0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ec00: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
ec10: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72   *p = pFile->pPr
ec20: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
ec30: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
ec40: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
ec50: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
ec60: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
ec70: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
ec80: 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
ec90: 75 73 65 64 20 3d 20 30 3b 0a 20 20 6e 55 6e 75  used = 0;.  nUnu
eca0: 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  sedFd++;.}../*.*
ecb0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
ecc0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
ecd0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
ece0: 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
ecf0: 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
ed00: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
ed10: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
ed20: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
ed30: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
ed40: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
ed50: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
ed60: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
ed70: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
ed80: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
ed90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
eda0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
edb0: 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
edc0: 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
edd0: 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
ede0: 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
edf0: 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
ee00: 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
ee10: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
ee20: 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
ee30: 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
ee40: 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
ee50: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
ee60: 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
ee70: 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
ee80: 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
ee90: 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
eea0: 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
eeb0: 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
eec0: 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
eed0: 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
eee0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
eef0: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
ef00: 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
ef10: 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
ef20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
ef30: 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
ef40: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
ef50: 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
ef60: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
ef70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ef80: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
ef90: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
efa0: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
efb0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
efc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
efd0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
efe0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
eff0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
f000: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
f010: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
f020: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
f030: 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
f040: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f050: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
f060: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
f070: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
f080: 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70  ed,.      osGetp
f090: 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65  id(0)));..  asse
f0a0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
f0b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
f0c0: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
f0d0: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
f0e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f0f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
f100: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
f110: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
f120: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
f130: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
f140: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
f150: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
f160: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
f170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
f180: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
f190: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
f1a0: 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
f1b0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
f1c0: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
f1d0: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
f1e0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
f1f0: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
f200: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
f210: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
f220: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f230: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
f240: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
f250: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
f260: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
f270: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
f280: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
f290: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
f2a0: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
f2b0: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
f2c0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
f2d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
f2e0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
f2f0: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
f300: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
f310: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
f320: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
f330: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
f340: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
f350: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
f360: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
f370: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
f380: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
f390: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
f3a0: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
f3b0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
f3c0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
f3d0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
f3e0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
f3f0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
f400: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
f410: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
f420: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
f430: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
f440: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
f450: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
f460: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
f470: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
f480: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
f490: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
f4a0: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
f4b0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
f4c0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
f4d0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
f4e0: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
f4f0: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
f500: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
f510: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
f520: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
f530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
f540: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
f550: 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  CK ){.#if !defin
f560: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
f570: 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
f580: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
f590: 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
f5a0: 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
f5b0: 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
f5c0: 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
f5d0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
f5e0: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
f5f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
f600: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
f610: 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
f620: 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
f630: 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
f640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
f650: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
f660: 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
f670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
f680: 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
f690: 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
f6a0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
f6b0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f6c0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f6d0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f6e0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f6f0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f700: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f710: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f720: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f730: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f740: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f750: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f760: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f770: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f780: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f790: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f7a0: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f7b0: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f7c0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f7d0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
f7f0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
f800: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f810: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f820: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f830: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f840: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f850: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f860: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f870: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f880: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f890: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f8a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f8b0: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f8c0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f8d0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f8e0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f8f0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
f900: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f910: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f920: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
f930: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
f940: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
f950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
f960: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
f970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f980: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f990: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
f9a0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f9b0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f9c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f9d0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64  = SHARED_FIRST+d
f9e0: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
f9f0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
fa00: 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65  RED_SIZE-divSize
fa10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
fa20: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
fa30: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
fa40: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
fa50: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
fa60: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fa70: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
fa80: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
fa90: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
faa0: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
fab0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
fac0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
fad0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
fae0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
faf0: 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
fb00: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
fb10: 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b  STYLE */.      {
fb20: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
fb30: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
fb40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
fb50: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
fb60: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
fb70: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
fb80: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
fb90: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
fba0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  ED_SIZE;.       
fbb0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
fbc0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
fbd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
fbe0: 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63  In theory, the c
fbf0: 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c  all to unixFileL
fc00: 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  ock() cannot fai
fc10: 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65  l because anothe
fc20: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  r.          ** p
fc30: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
fc40: 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  g an incompatibl
fc50: 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f  e lock. If it do
fc60: 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20  es, this .      
fc70: 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73      ** indicates
fc80: 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
fc90: 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
fca0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63  ollowing the loc
fcb0: 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  king.          *
fcc0: 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74  * protocol. If t
fcd0: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74  his happens, ret
fce0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fcf0: 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69  _RDLOCK. Returni
fd00: 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
fd10: 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c  SQLITE_BUSY woul
fd20: 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70  d confuse the up
fd30: 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72  per layer (in pr
fd40: 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73  actice it causes
fd50: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
fd60: 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c  n assert to fail
fd70: 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  ). */ .         
fd80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
fd90: 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_RDLOCK;.     
fda0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
fdb0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
fdc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
fdd0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
fde0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fdf0: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
fe00: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
fe10: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
fe20: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
fe30: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fe40: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
fe50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
fe60: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
fe70: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
fe80: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
fe90: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
fea0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
feb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  )==0 ){.      pI
fec0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fed0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
fee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fef0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
ff00: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
ff10: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
ff20: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
ff30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
ff40: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ock;.    }.  }. 
ff50: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ff60: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
ff70: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
ff80: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
ff90: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
ffa0: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
ffb0: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
ffc0: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
ffd0: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
ffe0: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
fff0: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
10000 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
10010 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
10020 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
10030 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
10040 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 ){.      lock.
10050 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
10060 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
10070 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
10080 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
10090 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65  tart = lock.l_le
100a0 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66  n = 0L;.      if
100b0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
100c0 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
100d0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
100e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
100f0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
10100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
10110 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
10120 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73  NLOCK;.        s
10130 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
10140 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
10150 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
10160 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
10170 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
10180 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10190 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
101a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
101b0 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
101c0 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
101d0 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
101e0 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
101f0 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
10200 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
10210 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
10220 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
10230 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
10240 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
10250 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
10260 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
10270 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
10280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
10290 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
102a0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
102b0 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
102c0 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
102d0 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ds(pFile);.    }
102e0 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b  .  }..end_unlock
102f0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
10300 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
10310 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
10320 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10330 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
10340 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10350 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
10360 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
10370 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
10380 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
10390 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
103a0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
103b0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
103c0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
103d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
103e0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
103f0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
10400 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
10410 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10420 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
10430 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10440 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10450 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
10460 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10470 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
10480 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10490 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73  MMAP_SIZE>0.  as
104a0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
104b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
104c0 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29  ((unixFile *)id)
104d0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
104e0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
104f0 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
10500 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b  , eFileLock, 0);
10510 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
10520 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
10530 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
10540 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
10550 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
10560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
10570 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
10580 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69  ile *pFd);.#endi
10590 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
105a0 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
105b0 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65  the parts of the
105c0 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70   "close file" op
105d0 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d  eration .** comm
105e0 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e  on to all lockin
105f0 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c  g schemes. It cl
10600 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f  oses the directo
10610 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68  ry and file.** h
10620 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20  andles, if they 
10630 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73  are valid, and s
10640 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f  ets all fields o
10650 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
10660 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30  * structure to 0
10670 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e  ..**.** It is *n
10680 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ot* necessary to
10690 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20   hold the mutex 
106a0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
106b0 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  e is called,.** 
106c0 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  even on VxWorks.
106d0 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62    A mutex will b
106e0 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78  e acquired on Vx
106f0 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20  Works by the.** 
10700 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
10710 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a  leId() routine..
10720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
10730 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69  oseUnixFile(sqli
10740 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
10750 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10760 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10770 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
10780 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
10790 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
107a0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  le);.#endif.  if
107b0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
107c0 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
107d0 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  e(pFile, pFile->
107e0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
107f0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
10800 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .  }.#if OS_VXWO
10810 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  RKS.  if( pFile-
10820 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20  >pId ){.    if( 
10830 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
10840 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
10850 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  TE ){.      osUn
10860 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d  link(pFile->pId-
10870 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
10880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f  ;.    }.    vxwo
10890 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
108a0 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20  (pFile->pId);.  
108b0 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
108c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
108d0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e  def SQLITE_UNLIN
108e0 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20  K_AFTER_CLOSE.  
108f0 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
10900 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
10910 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73  DELETE ){.    os
10920 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50  Unlink(pFile->zP
10930 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
10940 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29  3_free(*(char**)
10950 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a  &pFile->zPath);.
10960 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68      pFile->zPath
10970 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
10980 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
10990 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
109a0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e  ile->h));.  Open
109b0 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
109c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
109d0 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  e->pPreallocated
109e0 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
109f0 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
10a00 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
10a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10a20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
10a30 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
10a40 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
10a50 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10a60 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
10a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
10a80 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10a90 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
10aa0 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46   verifyDbFile(pF
10ab0 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  ile);.  unixUnlo
10ac0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
10ad0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
10ae0 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
10af0 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
10b00 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
10b10 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
10b20 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
10b30 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
10b40 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
10b50 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
10b60 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
10b70 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
10b80 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
10b90 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
10ba0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
10bb0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
10bc0 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
10bd0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
10be0 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
10bf0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
10c00 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
10c10 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
10c20 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
10c30 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
10c40 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
10c50 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
10c60 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
10c70 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
10c80 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
10c90 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
10ca0 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
10cb0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
10cc0 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
10cd0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
10ce0 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
10cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
10d00 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
10d10 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
10d20 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
10d30 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
10d40 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
10d50 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
10d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
10d80 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
10d90 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
10da0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
10e80 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
10e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10eb0 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
10ec0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
10ed0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
10ee0 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
10ef0 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
10f00 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
10f10 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
10f20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
10f30 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
10f40 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
10f50 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10f60 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
10f70 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
10f80 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
10f90 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
10fa0 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
10fb0 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
10fc0 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
10fd0 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
10fe0 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
10ff0 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
11000 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
11010 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
11020 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
11030 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
11040 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
11050 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
11060 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
11070 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
11080 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
11090 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
110a0 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
110b0 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
110c0 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
110d0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
110e0 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
110f0 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
11100 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
11110 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
11120 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
11130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11140 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
11150 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
11160 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
11170 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
11180 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
11190 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
111a0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
111b0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
111c0 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
111d0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
111e0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
111f0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
11200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11210 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
11220 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
11230 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
11240 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
11250 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
11260 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
11270 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
11280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11290 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
112a0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
112b0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
112c0 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
112d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
112e0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
112f0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
11300 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11310 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
11320 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11330 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
11340 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
11350 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
11360 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
11370 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11380 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
11390 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
113a0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
113b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
113c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11410 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11460 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11480 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
11490 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
114c0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
114d0 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
114e0 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
114f0 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
11500 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
11510 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
11520 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
11530 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
11540 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
11550 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
11560 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
11570 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
11580 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
11590 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
115a0 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
115b0 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
115c0 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
115d0 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
115e0 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
115f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
11600 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
11610 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
11620 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
11630 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
11640 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
11650 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
11660 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
11670 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
11680 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
11690 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
116a0 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
116b0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
116c0 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
116d0 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
116e0 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
116f0 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
11700 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
11710 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
11720 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
11730 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
11740 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
11750 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
11760 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
11770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
11780 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
11790 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
117a0 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
117b0 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
117c0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
117d0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
117e0 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
117f0 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
11800 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
11810 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
11820 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
11830 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
11840 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
11850 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
11860 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
11870 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
11880 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
11890 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
118a0 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
118b0 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
118c0 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
118d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
118e0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
118f0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
11900 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
11910 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
11920 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
11930 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
11940 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
11950 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
11960 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
11970 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
11980 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
11990 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
119a0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
119b0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
119c0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
119d0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
119e0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
119f0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
11a00 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
11a10 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
11a20 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
11a30 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
11a40 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
11a50 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
11a60 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
11a70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
11a80 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
11a90 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
11aa0 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
11ab0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
11ac0 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
11ad0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
11ae0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11af0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11b00 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
11b10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11b20 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
11b30 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
11b40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11b50 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
11b60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11b70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11b80 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
11b90 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
11ba0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11bb0 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20  );.  reserved = 
11bc0 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20  osAccess((const 
11bd0 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
11be0 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d  kingContext, 0)=
11bf0 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  =0;.  OSTRACE(("
11c00 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11c10 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
11c20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
11c30 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
11c40 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
11c50 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
11c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
11c70 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
11c80 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
11c90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
11ca0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
11cb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11cc0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
11cd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
11ce0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
11cf0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
11d00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
11d10 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
11d20 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
11d30 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
11d40 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
11d50 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
11d60 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
11d70 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
11d80 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
11d90 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
11da0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
11db0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
11dc0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
11dd0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
11de0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
11df0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
11e00 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
11e10 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
11e20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
11e30 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
11e40 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
11e50 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
11e60 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
11e70 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
11e80 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
11e90 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
11ea0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
11eb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
11ec0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
11ed0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
11ee0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11ef0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11f00 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
11f10 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
11f20 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11f30 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
11f40 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
11f50 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
11f60 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
11f70 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
11f80 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
11f90 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11fa0 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
11fb0 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
11fc0 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
11fd0 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
11fe0 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
11ff0 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
12000 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
12010 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
12020 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12030 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12040 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12050 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12060 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
12070 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
12080 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12090 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
120a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
120b0 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
120c0 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
120d0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
120e0 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
120f0 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
12100 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
12110 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
12120 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
12130 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
12140 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12150 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
12160 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12170 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12180 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
12190 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
121a0 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
121b0 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
121c0 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
121d0 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
121e0 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
121f0 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
12200 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
12210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12220 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
12230 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
12240 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
12250 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
12260 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
12270 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
12280 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
12290 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
122a0 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
122b0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
122c0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
122d0 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
122e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
122f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
12300 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
12310 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12320 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12330 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
12340 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
12350 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
12360 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
12370 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12380 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
12390 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
123a0 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
123b0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
123c0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
123d0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
123e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
123f0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
12400 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12410 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
12420 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
12430 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
12440 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
12450 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
12460 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
12470 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
12480 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
12490 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
124a0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
124b0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
124c0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
124d0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
124e0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
124f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12500 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
12510 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12520 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
12530 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
12540 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
12550 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
12560 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
12570 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
12580 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
12590 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
125a0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
125b0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
125c0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
125d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
125e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
125f0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
12600 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
12610 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
12620 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
12630 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
12640 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
12650 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12660 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
12670 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
12680 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
12690 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
126a0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
126b0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
126c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
126d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
126e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
126f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
12700 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
12710 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
12720 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
12730 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
12740 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
12750 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
12760 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
12770 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
12780 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
12790 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
127a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
127b0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
127c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
127d0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
127e0 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
127f0 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
12800 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
12810 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
12820 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
12830 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d  K );.  rc = osRm
12840 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  dir(zLockFile);.
12850 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
12860 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
12870 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45  rrno;.    if( tE
12880 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
12890 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
128a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
128b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
128c0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
128d0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
128e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
128f0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
12900 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
12910 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12920 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
12950 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73   a file.  Make s
12960 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  ure the lock has
12970 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62   been released b
12980 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a  efore closing..*
12990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
129a0 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
129b0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
129c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
129d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
129e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
129f0 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   );.  dotlockUnl
12a00 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
12a10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
12a20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
12a30 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72  ontext);.  retur
12a40 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
12a50 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  id);.}./********
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
12a70 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
12a80 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12a90 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12aa0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12af0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b40 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b60 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
12b70 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12ba0 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12bb0 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12bc0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12bd0 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12be0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12bf0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12c00 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12c10 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
12c20 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
12c30 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
12c40 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
12c50 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
12c60 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12c70 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12c80 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
12c90 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12ca0 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12cb0 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12cc0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12cd0 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12ce0 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12cf0 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12d00 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12d10 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
12d20 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12d30 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
12d40 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
12d50 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
12d60 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
12d70 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
12d80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12d90 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12da0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12db0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12dc0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79  YLE../*.** Retry
12dd0 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74   flock() calls t
12de0 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49  hat fail with EI
12df0 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49  NTR.*/.#ifdef EI
12e00 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72  NTR.static int r
12e10 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20  obust_flock(int 
12e20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  fd, int op){.  i
12e30 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20  nt rc;.  do{ rc 
12e40 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20  = flock(fd,op); 
12e50 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
12e60 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
12e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
12e80 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f  else.# define ro
12e90 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20  bust_flock(a,b) 
12ea0 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69  flock(a,b).#endi
12eb0 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  f.     ../*.** T
12ec0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
12ed0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
12ee0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
12ef0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
12f00 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
12f10 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
12f20 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
12f30 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
12f40 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
12f50 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12f60 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12f70 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12f80 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12f90 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12fa0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12fb0 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12fc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12fd0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12fe0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12ff0 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  t flockCheckRese
13000 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13010 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13020 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13040 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13050 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13060 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13070 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
13080 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13090 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
130a0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
130b0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
130c0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a  rt( pFile );.  .
130d0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
130e0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
130f0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
13100 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
13110 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13120 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
13130 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
13140 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
13150 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
13160 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
13170 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
13180 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
13190 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d   ){.    /* attem
131a0 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  pt to get the lo
131b0 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  ck */.    int lr
131c0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
131d0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
131e0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
131f0 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
13200 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
13210 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
13220 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72  */.      lrc = r
13230 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13240 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
13250 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29        if ( lrc )
13260 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
13270 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
13280 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b         /* unlock
13290 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20   failed with an 
132a0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
132b0 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f   lrc = SQLITE_IO
132c0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
132d0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
132e0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
132f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
13300 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
13310 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
13320 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13330 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72  rno;.      reser
13340 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  ved = 1;.      /
13350 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  * someone else m
13360 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
13370 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c  erved */.      l
13380 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13390 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
133a0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
133b0 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20  ERR_LOCK); .    
133c0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
133d0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
133e0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
133f0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
13400 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13410 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
13420 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
13430 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
13440 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29  %d %d %d (flock)
13450 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
13460 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
13470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13480 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13490 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
134a0 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
134b0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
134c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
134d0 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a      reserved=1;.
134e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
134f0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
13500 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
13510 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
13520 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
13530 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13540 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
13550 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
13560 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
13570 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
13580 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
13590 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
135a0 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
135b0 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
135c0 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
135d0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
135e0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
135f0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
13600 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
13610 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
13620 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
13630 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
13640 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
13650 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
13660 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
13670 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
13680 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
13690 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
136a0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
136b0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
136c0 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
136d0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
136e0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
136f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
13700 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
13710 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
13720 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
13730 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
13740 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
13750 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
13760 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
13770 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
13780 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13790 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
137a0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
137b0 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
137c0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
137d0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
137e0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
137f0 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65   flock() only re
13800 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
13810 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
13820 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
13830 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
13840 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
13850 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
13860 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
13870 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
13880 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
13890 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
138a0 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
138b0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
138c0 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
138d0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
138e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
138f0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
13900 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
13910 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
13920 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
13930 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
13940 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
13950 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71  int flockLock(sq
13960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13970 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13980 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13990 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
139a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
139b0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
139c0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
139d0 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
139e0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
139f0 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
13a00 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
13a10 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
13a20 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
13a30 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
13a40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
13a50 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
13a60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
13a70 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65  FileLock;.    re
13a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a90 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
13aa0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13ab0 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72  ck */.  .  if (r
13ac0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
13ad0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
13ae0 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20  LOCK_NB)) {.    
13af0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13b00 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  no;.    /* didn'
13b10 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
13b20 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  usy */.    rc = 
13b30 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13b40 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13b50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
13b60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
13b70 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
13b80 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
13b90 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13ba0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
13bb0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
13bc0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
13bd0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
13be0 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
13bf0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13c00 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53  leLock;.  }.  OS
13c10 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
13c20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29  %d %s %s (flock)
13c30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
13c40 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
13c50 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
13c60 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
13c70 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
13c80 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  "));.#ifdef SQLI
13c90 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13ca0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
13cb0 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d  ( (rc & 0xff) ==
13cc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
13cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13ce0 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BUSY;.  }.#endi
13cf0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
13d00 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13d10 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  RORS */.  return
13d20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
13d30 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
13d40 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
13d50 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
13d60 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
13d70 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
13d80 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13d90 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
13da0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
13db0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
13dc0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13dd0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
13de0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
13df0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13e00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13e10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13e20 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
13e30 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  nt flockUnlock(s
13e40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
13e50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
13e60 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13e70 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13e80 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
13e90 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
13ea0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
13eb0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
13ec0 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70  %d (flock)\n", p
13ed0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
13ee0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
13ef0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
13f00 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
13f10 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13f20 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13f30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13f40 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13f50 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13f60 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13f70 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13f90 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13fa0 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13fb0 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
13fc0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
13fd0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
13fe0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13ff0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14000 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14010 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
14020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14030 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
14040 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
14050 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
14060 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
14070 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
14080 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
14090 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
140a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
140b0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
140c0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
140d0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
140e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
140f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14100 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
14110 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14120 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
14130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14140 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
14150 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
14160 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
14170 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
14180 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73  ile *id) {.  ass
14190 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
141a0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  flockUnlock(id, 
141b0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75  NO_LOCK);.  retu
141c0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
141d0 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
141e0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
141f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
14200 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
14210 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14220 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
14230 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
14240 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14260 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
14270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
142b0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
142c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14300 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
14320 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
14330 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
14340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14350 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
14360 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
14370 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
14380 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
14390 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
143a0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
143b0 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
143c0 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
143d0 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
143e0 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
143f0 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
14400 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
14410 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
14420 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14430 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
14440 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
14450 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
14460 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
14470 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
14480 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
14490 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
144a0 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
144b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
144c0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
144d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
144e0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
144f0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
14500 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
14510 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
14520 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
14530 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
14540 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
14550 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
14560 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
14570 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
14580 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
14590 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
145a0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
145b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
145c0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
145d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
145e0 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65  nt semXCheckRese
145f0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14600 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
14610 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
14620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14630 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
14640 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
14650 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
14660 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
14670 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
14680 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14690 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
146a0 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
146b0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
146c0 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
146d0 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
146e0 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
146f0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
14700 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
14710 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
14720 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
14730 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
14740 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
14750 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
14760 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
14770 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
14780 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  .    sem_t *pSem
14790 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
147a0 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28  ->pSem;..    if(
147b0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
147c0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  m)==-1 ){.      
147d0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
147e0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41  no;.      if( EA
147f0 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29  GAIN != tErrno )
14800 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14810 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
14820 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
14830 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
14840 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29  ECKRESERVEDLOCK)
14850 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  ;.        storeL
14860 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
14870 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
14880 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
14890 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
148a0 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65  has the lock whe
148b0 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c  n we are in NO_L
148c0 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  OCK */.        r
148d0 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65  eserved = (pFile
148e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48  ->eFileLock < SH
148f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14900 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14910 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
14920 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77   have it if we w
14930 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ant it */.      
14940 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a  sem_post(pSem);.
14950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
14960 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
14970 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d  CK %d %d %d (sem
14980 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14990 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
149a0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
149b0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
149c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
149d0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
149e0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
149f0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
14a00 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
14a10 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
14a20 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
14a30 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
14a40 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
14a50 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
14a60 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
14a70 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
14a80 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
14a90 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
14aa0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
14ab0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
14ac0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
14ad0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
14ae0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
14af0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
14b00 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
14b10 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
14b20 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
14b30 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
14b40 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
14b50 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
14b60 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
14b70 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
14b80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
14b90 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
14ba0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
14bb0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
14bc0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
14bd0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
14be0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
14bf0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
14c00 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
14c10 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14c20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14c30 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
14c40 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
14c50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14c60 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
14c70 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
14c80 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73   Semaphore locks
14c90 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
14ca0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
14cb0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
14cc0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
14cd0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
14ce0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
14cf0 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
14d00 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
14d10 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
14d20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
14d30 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
14d40 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
14d50 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
14d60 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
14d70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14d80 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
14d90 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
14da0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
14db0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
14dc0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
14dd0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
14de0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14df0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
14e00 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14e10 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14e20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
14e40 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14e50 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14e60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14e70 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  E_OK;..  /* if w
14e80 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
14e90 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
14ea0 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
14eb0 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
14ec0 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
14ed0 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
14ee0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
14ef0 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
14f00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
14f10 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14f20 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
14f30 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73  E_OK;.    goto s
14f40 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
14f50 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65  .  .  /* lock se
14f60 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20  maphore now but 
14f70 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c  bail out when al
14f80 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f  ready locked. */
14f90 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61  .  if( sem_trywa
14fa0 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
14fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14fc0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73  BUSY;.    goto s
14fd0 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  em_end_lock;.  }
14fe0 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73  ..  /* got it, s
14ff0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
15000 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
15010 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15020 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73  = eFileLock;.. s
15030 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72  em_end_lock:.  r
15040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15050 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
15060 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
15070 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
15080 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
15090 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
150a0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
150b0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
150c0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
150d0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
150e0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
150f0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
15100 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
15110 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
15120 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
15130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15140 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
15150 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63  ic int semXUnloc
15160 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15170 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
15180 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
15190 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
151a0 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
151b0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
151c0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
151d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
151e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
151f0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
15200 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
15210 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29   %d pid=%d (sem)
15220 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
15230 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
15240 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
15250 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
15260 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
15270 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
15280 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
15290 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
152a0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
152b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
152c0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
152d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
152e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
152f0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
15300 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
15310 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
15320 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
15330 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
15340 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
15350 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15360 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
15370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15380 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
15390 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63  no, really unloc
153a0 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d  k. */.  if ( sem
153b0 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20  _post(pSem)==-1 
153c0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20  ) {.    int rc, 
153d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
153e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
153f0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15400 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15410 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
15420 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15430 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
15440 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
15450 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
15460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15470 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
15480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15490 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
154a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
154b0 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
154c0 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
154d0 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28  c int semXClose(
154e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
154f0 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a  ) {.  if( id ){.
15500 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46      unixFile *pF
15510 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
15520 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c  )id;.    semXUnl
15530 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15540 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
15550 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
15560 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
15570 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
15580 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
15590 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
155a0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
155b0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
155c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
155d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
155e0 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
155f0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
15600 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
15610 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
15620 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
15630 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
15640 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
15650 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
15660 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
15670 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
15720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15730 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
15740 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
15770 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
15780 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
15790 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
157a0 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
157b0 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
157c0 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
157d0 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
157e0 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
157f0 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
15800 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
15810 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
15820 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
15830 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
15840 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
15850 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
15860 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
15870 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15880 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
15890 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
158a0 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
158b0 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
158c0 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
158d0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
158e0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
158f0 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
15900 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
15910 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
15920 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
15930 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
15940 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
15950 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15960 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
15970 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
15980 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
15990 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
159a0 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
159b0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
159c0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
159d0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
159e0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
159f0 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
15a00 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15a10 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
15a20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
15a30 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
15a40 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
15a50 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
15a60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
15a70 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
15a80 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
15a90 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
15aa0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
15ab0 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
15ac0 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
15ad0 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
15ae0 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
15af0 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
15b20 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
15b30 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
15b40 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
15b50 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
15b60 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
15b70 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
15b80 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15b90 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
15ba0 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
15bb0 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
15bc0 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
15bd0 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
15be0 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
15bf0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
15c00 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
15c10 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
15c20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
15c30 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
15c40 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
15c50 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
15c60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
15c70 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
15c80 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
15c90 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
15ca0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
15cb0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
15cc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
15cd0 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
15ce0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
15cf0 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
15d00 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
15d10 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
15d20 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
15d30 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
15d40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
15d50 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
15d60 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
15d70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
15d80 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
15d90 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
15da0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
15db0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15dc0 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
15dd0 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
15de0 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
15df0 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
15e00 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
15e10 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
15e20 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
15e30 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
15e40 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
15e50 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
15e60 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
15e70 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
15e80 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
15e90 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
15ea0 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
15eb0 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
15ec0 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
15ed0 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
15ee0 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
15ef0 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
15f00 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
15f10 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
15f20 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
15f30 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15f40 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
15f50 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15f60 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
15f70 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
15f80 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
15f90 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
15fa0 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
15fb0 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
15fc0 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
15fd0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15fe0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
15ff0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16000 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
16010 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
16020 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
16030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16040 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
16050 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
16060 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
16070 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
16080 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
16090 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
160a0 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
160b0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
160c0 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
160d0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
160e0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
160f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16100 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
16110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
16130 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
16140 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
16150 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
16160 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
16170 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
16180 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
16190 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
161a0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
161b0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
161c0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
161d0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
161e0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
161f0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
16200 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
16210 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
16220 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
16230 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
16240 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
16250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16260 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
16270 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
16280 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
16290 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
162a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
162b0 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
162c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
162d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
162e0 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
162f0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b  ontext *context;
16300 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
16310 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
16320 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
16330 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
16340 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
16350 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74  ile );.  context
16360 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
16370 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
16380 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
16390 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72    if( context->r
163a0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a  eserved ){.    *
163b0 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
163c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
163d0 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
163e0 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
163f0 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16400 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16410 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
16420 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
16430 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
16440 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
16450 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
16460 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
16470 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
16480 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
16490 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
164a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
164b0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
164c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
164d0 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20  olds it..   */. 
164e0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
164f0 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68  {.    /* lock th
16500 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20  e RESERVED byte 
16510 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
16520 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16530 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16540 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16550 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69  E, 1,1);  .    i
16560 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72  f( SQLITE_OK==lr
16570 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  c ){.      /* if
16580 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
16590 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
165a0 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
165b0 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
165c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
165d0 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
165e0 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65       lrc = afpSe
165f0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16600 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
16610 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
16620 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  0);.    } else {
16630 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
16640 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68  failed to get th
16650 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65  e lock then some
16660 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61  one else must ha
16670 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72  ve it */.      r
16680 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
16690 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f   }.    if( IS_LO
166a0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
166b0 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20  .      rc=lrc;. 
166c0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
166d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
166e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
166f0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16700 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
16710 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
16720 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
16730 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
16740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16750 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
16760 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
16770 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
16780 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
16790 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
167a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
167b0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
167c0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
167d0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
167e0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
167f0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
16800 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
16810 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
16820 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
16830 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
16840 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
16850 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
16860 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
16870 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
16880 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
16890 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
168a0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
168b0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
168c0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
168d0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
168e0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
168f0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
16900 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
16910 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
16920 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
16930 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
16940 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
16950 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
16960 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
16970 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
16980 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
16990 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
169a0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
169b0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
169c0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
169d0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
169e0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
169f0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
16a00 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
16a10 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16a20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
16a30 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
16a40 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
16a50 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
16a60 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
16a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
16a80 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
16a90 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
16aa0 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
16ab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16ac0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16ad0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16ae0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
16af0 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
16b00 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
16b10 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16b20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
16b30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
16b40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
16b50 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
16b60 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
16b70 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16b80 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
16b90 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
16ba0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
16bb0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16bc0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16bd0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
16be0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
16bf0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
16c00 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
16c10 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
16c20 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
16c30 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
16c40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
16c50 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
16c60 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
16c70 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
16c80 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
16c90 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
16ca0 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
16cb0 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
16cc0 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
16cd0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
16ce0 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
16cf0 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
16d00 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
16d10 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
16d20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
16d30 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
16d40 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
16d50 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
16d60 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
16d70 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16d80 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
16d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16da0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16db0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
16dc0 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
16dd0 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
16de0 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
16df0 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
16e00 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
16e10 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
16e20 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
16e30 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
16e40 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
16e50 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
16e60 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
16e70 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
16e80 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
16e90 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
16ea0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
16eb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
16ec0 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
16ed0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16ee0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
16ef0 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
16f00 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
16f10 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
16f20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
16f30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16f40 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
16f50 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
16f60 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
16f70 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
16f80 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
16f90 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
16fa0 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
16fb0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
16fc0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16fd0 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68  .  /* If some th
16fe0 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
16ff0 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76  PID has a lock v
17000 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75  ia a different u
17010 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61  nixFile*.  ** ha
17020 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75  ndle that preclu
17030 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65  des the requeste
17040 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42  d lock, return B
17050 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  USY..  */.  if( 
17060 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
17070 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  k!=pInode->eFile
17080 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20  Lock && .       
17090 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
170a0 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
170b0 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
170c0 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20  ARED_LOCK)).    
170d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
170e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
170f0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
17100 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
17110 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
17120 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
17130 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
17140 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
17150 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
17160 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
17170 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
17180 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
17190 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
171a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
171b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
171c0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
171d0 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49  OCK && .     (pI
171e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
171f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
17200 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17210 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
17220 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
17230 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17240 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
17250 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
17260 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
17270 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17280 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
17290 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
172a0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
172b0 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
172c0 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
172d0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
172e0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
172f0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  lock;.  }.    . 
17300 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
17310 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
17320 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
17330 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
17340 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
17350 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
17360 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
17370 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
17380 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
17390 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
173a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
173b0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
173c0 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
173d0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
173e0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
173f0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
17400 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
17410 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a      int failed;.
17420 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17430 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17440 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17450 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
17460 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
17470 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
17480 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  = failed;.      
17490 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
174a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
174b0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
174c0 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
174d0 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
174e0 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
174f0 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
17500 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
17510 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
17520 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
17530 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
17540 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
17550 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c   int lrc1, lrc2,
17560 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a   lrc1Errno = 0;.
17570 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73      long lk, mas
17580 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65  k;.    .    asse
17590 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
175a0 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
175b0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
175c0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
175d0 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20        .    mask 
175e0 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d  = (sizeof(long)=
175f0 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e  =8) ? LARGEST_IN
17600 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66  T64 : 0x7fffffff
17610 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ;.    /* Now get
17620 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53   the read-lock S
17630 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20  HARED_LOCK */.  
17640 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74    /* note that t
17650 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
17660 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65  e randomness doe
17670 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74  sn't matter that
17680 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20   much */.    lk 
17690 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20  = random(); .   
176a0 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
176b0 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b  yte = (lk & mask
176c0 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
176d0 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20   1);.    lrc1 = 
176e0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
176f0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17700 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48  e, .          SH
17710 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
17720 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17730 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 1);.    if( IS
17740 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
17750 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45  ) ){.      lrc1E
17760 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  rrno = pFile->la
17770 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  stErrno;.    }. 
17780 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
17790 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
177a0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63   lock */.    lrc
177b0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
177c0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
177d0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
177e0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
177f0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
17800 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b  _ERROR(lrc1) ) {
17810 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
17820 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63  Errno(pFile, lrc
17830 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72  1Errno);.      r
17840 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20  c = lrc1;.      
17850 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
17860 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
17870 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17880 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72  lrc2) ){.      r
17890 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20  c = lrc2;.      
178a0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
178b0 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  k;.    } else if
178c0 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45  ( lrc1 != SQLITE
178d0 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63  _OK ) {.      rc
178e0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65   = lrc1;.    } e
178f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
17900 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
17910 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
17920 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
17930 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
17940 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
17950 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17960 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
17970 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
17980 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
17990 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
179a0 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
179b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
179c0 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
179d0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20  in this.     ** 
179e0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
179f0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
17a00 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
17a10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17a20 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
17a30 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
17a40 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
17a50 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
17a60 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
17a70 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
17a80 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
17a90 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
17aa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
17ab0 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
17ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
17ad0 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  failed = 0;.    
17ae0 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
17af0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
17b00 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b     if (eFileLock
17b10 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
17b20 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17b30 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44  eLock < RESERVED
17b40 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
17b50 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
17b60 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
17b70 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
17b80 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17b90 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17ba0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17bb0 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66  , 1,1);.      if
17bc0 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  ( !failed ){.   
17bd0 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65       context->re
17be0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
17bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
17c00 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69   (!failed && eFi
17c10 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53  leLock == EXCLUS
17c20 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
17c30 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
17c40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
17c50 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
17c60 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
17c70 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
17c80 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
17c90 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
17ca0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
17cb0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17cc0 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
17cd0 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
17ce0 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f  pUnlock.      */
17cf0 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69  .      if( !(fai
17d00 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17d10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17d20 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17d30 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
17d60 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20  yte, 1, 0)) ){. 
17d70 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65         int faile
17d80 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  d2 = SQLITE_OK;.
17d90 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
17da0 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
17db0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
17dc0 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
17dd0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
17de0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17df0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
17e00 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17e30 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
17e40 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64        if( failed
17e50 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61   && (failed2 = a
17e60 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17e70 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17e80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17e90 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
17ea0 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d  _FIRST + pInode-
17eb0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17ec0 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1)) ){.         
17ed0 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61   /* Can't reesta
17ee0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17ef0 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63   lock.  Sqlite c
17f00 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20  an't deal, this 
17f10 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
17f20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65  a critical I/O e
17f30 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
17f40 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
17f50 20 28 28 66 61 69 6c 65 64 20 26 20 30 78 66 66   ((failed & 0xff
17f60 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
17f70 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
17fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
17fb0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17fc0 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
17fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
17fe0 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
17ff0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18000 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
18010 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
18020 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
18030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18040 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
18050 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18060 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
18070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
18080 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
18090 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
180a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
180b0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
180c0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
180d0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
180e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
180f0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
18100 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
18110 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
18120 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
18130 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
18140 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
18150 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
18160 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
18170 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
18180 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
18190 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
181a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
181b0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
181c0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
181d0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
181e0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
181f0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
18200 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
18210 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
18220 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
18230 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18240 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
18250 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18260 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
18270 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18280 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18290 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
182a0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
182b0 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
182c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
182d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
182e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
182f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
18300 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18310 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
18320 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
18330 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
18340 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
18350 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
18360 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
18370 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
18380 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
18390 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
183a0 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
183b0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
183c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
183d0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
183e0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
183f0 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
18400 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
18410 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
18420 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
18430 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18440 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
18450 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
18460 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
18470 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
18480 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
18490 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
184a0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
184b0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
184c0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
184d0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
184e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
184f0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
18500 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
18510 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
18520 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
18530 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
18540 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
18550 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
18560 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
18570 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
18580 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
18590 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
185a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
185b0 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
185c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
185d0 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
185e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
185f0 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
18600 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
18610 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
18620 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
18630 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
18640 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
18650 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
18660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
18670 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
18680 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
18690 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
186a0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
186b0 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
186c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
186d0 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
186e0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
186f0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
18700 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
18710 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
18720 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
18730 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
18740 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
18750 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
18760 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
18770 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
18780 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
18790 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
187a0 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
187b0 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
187c0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
187d0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
187e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
187f0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
18800 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18810 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
18820 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
18830 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
18840 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
18850 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
18860 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
18870 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
18880 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
18890 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
188a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
188b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
188c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
188d0 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
188e0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
188f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18900 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18910 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18920 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18930 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
18940 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
18950 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
18960 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
18970 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
18980 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
18990 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
189a0 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
189b0 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
189c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
189d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
189e0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
189f0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
18a00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
18a10 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
18a20 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
18a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18a50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18a60 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
18a70 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18a80 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18a90 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18aa0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18ab0 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
18ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ad0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18ae0 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
18af0 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
18b00 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
18b10 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18b20 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18b30 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
18b40 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
18b50 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
18b60 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18b70 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
18b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18ba0 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18bb0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18bc0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18bd0 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
18be0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
18bf0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
18c00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18c20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
18c30 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
18c40 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
18c50 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
18c60 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
18c70 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
18c80 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
18c90 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
18ca0 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
18cb0 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
18cc0 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
18cd0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
18ce0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18cf0 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
18d00 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
18d10 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
18d20 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
18d30 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
18d40 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
18d50 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
18d60 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18d70 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
18d80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18d90 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
18da0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
18db0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
18dc0 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18de0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18df0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18e00 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
18e10 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
18e20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
18e30 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
18e40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18e50 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
18e60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18e70 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
18e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18ea0 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18eb0 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
18ec0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18ed0 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
18ee0 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
18ef0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
18f00 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
18f10 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
18f20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
18f30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
18f40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18f50 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
18f60 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18f70 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
18f80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
18f90 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
18fa0 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
18fb0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
18fc0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
18fd0 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
18fe0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
18ff0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19000 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
19010 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
19020 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
19030 69 64 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e  id!=0 );.  afpUn
19040 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
19050 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
19060 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69  tex();.  if( pFi
19070 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
19080 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
19090 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
190a0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
190b0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
190c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
190d0 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
190e0 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
190f0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
19100 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
19110 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
19120 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
19130 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
19140 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  node->aPending. 
19150 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
19160 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
19170 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   when.    ** the
19180 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
19190 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
191a0 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
191b0 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
191c0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
191d0 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
191e0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
191f0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72  ingContext);.  r
19200 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
19210 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
19220 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
19230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
19240 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
19250 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
19260 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
19270 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
19280 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
19290 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
192a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
192b0 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
192c0 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
192d0 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
192e0 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
192f0 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
19300 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
19310 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
19320 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
19330 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
19340 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
19350 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
19360 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
19390 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
193a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
19410 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
19480 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
19490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
194a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
194b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
194c0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
194d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
194e0 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
194f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19500 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19510 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
19520 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
19530 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
19540 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
19550 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
19560 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
19570 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19580 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
19590 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
195a0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
195b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
195c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
195d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
195e0 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
195f0 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
19600 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19610 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
19620 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
19630 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
19640 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
19650 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
19660 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
19670 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
19680 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
19690 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
196a0 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
196b0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
196c0 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
196d0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
196e0 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
196f0 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
19700 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
19710 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
19720 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
19730 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
19750 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
19760 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
19770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19780 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
19790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197d0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
197e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19820 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19830 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
19840 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
19850 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19870 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
19880 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19890 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
198a0 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
198b0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
198c0 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
198d0 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
198e0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
198f0 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
19900 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
19910 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
19920 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
19930 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
19940 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
19950 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
19960 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
19970 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
19980 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19990 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
199a0 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
199b0 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
199c0 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
199d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
199e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
199f0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
19a00 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
19a10 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
19a20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19a30 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
19a40 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
19a50 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
19a60 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
19a70 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
19a80 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19a90 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
19aa0 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
19ab0 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
19ac0 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
19ad0 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
19ae0 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
19af0 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
19b00 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20  USE_PREAD.** in 
19b10 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
19b20 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
19b30 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
19b40 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19b50 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
19b60 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
19b70 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19b80 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19b90 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
19ba0 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
19bb0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19bc0 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19bd0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
19be0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19bf0 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
19c00 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
19c10 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
19c20 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
19c30 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
19c40 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
19c50 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19c60 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
19c70 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
19c80 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19c90 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
19ca0 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
19cb0 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
19cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
19cd0 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a  d->h>2 );.  do{.
19ce0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
19cf0 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
19d00 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
19d10 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19d20 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19d30 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19d40 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
19d50 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19d60 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19d70 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
19d80 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
19d90 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19da0 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
19db0 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
19dc0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
19dd0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19de0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19df0 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
19e00 66 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20  fset = -1 );.   
19e10 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30   if( newOffset<0
19e20 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
19e30 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19e40 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a  le*)id, errno);.
19e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
19e60 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
19e70 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
19e80 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
19e90 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63  f.    if( got==c
19ea0 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
19eb0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19ec0 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
19ed0 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20  NTR ){ got = 1; 
19ee0 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20  continue; }.    
19ef0 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20    prior = 0;.   
19f00 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19f10 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
19f20 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20    errno);.      
19f30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
19f40 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20   if( got>0 ){.  
19f50 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a      cnt -= got;.
19f60 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
19f70 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  got;.      prior
19f80 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
19f90 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f  Buf = (void*)(go
19fa0 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29  t + (char*)pBuf)
19fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
19fc0 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d  ( got>0 );.  TIM
19fd0 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
19fe0 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E(("READ    %-3d
19ff0 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c   %5d %7lld %llu\
1a000 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a010 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72  id->h, got+prior
1a020 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20  , offset-prior, 
1a030 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a040 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72  .  return got+pr
1a050 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ior;.}../*.** Re
1a060 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
1a070 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
1a080 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
1a090 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
1a0a0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
1a0b0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
1a0c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
1a0d0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1a0e0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1a0f0 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a  c int unixRead(.
1a100 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a110 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75  id, .  void *pBu
1a120 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1a130 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1a140 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46  ffset.){.  unixF
1a150 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1a160 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1a170 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
1a180 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1a190 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
1a1a0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1a1b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a1c0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1a1d0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1a1e0 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1a1f0 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1a200 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1a210 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1a220 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1a230 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1a240 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1a250 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1a260 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
1a270 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  sed==0.       ||
1a280 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47   offset>=PENDING
1a290 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20  _BYTE+512.      
1a2a0 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d   || offset+amt<=
1a2b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20  PENDING_BYTE .  
1a2c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  );.#endif..#if S
1a2d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1a2e0 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1a2f0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1a300 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
1a310 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1a320 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1a330 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1a340 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1a350 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1a360 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1a370 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a380 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1a390 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1a3a0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1a3b0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1a3c0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a3d0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a3e0 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
1a3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a400 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1a410 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1a420 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a430 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1a440 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1a450 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a460 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a470 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
1a480 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1a490 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1a4a0 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1a4b0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1a4c0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1a4d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74   }.#endif..  got
1a4e0 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1a4f0 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42  File, offset, pB
1a500 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20  uf, amt);.  if( 
1a510 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  got==amt ){.    
1a520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a530 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f  ;.  }else if( go
1a540 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61  t<0 ){.    /* la
1a550 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1a560 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20  eekAndRead */.  
1a570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a580 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
1a590 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  lse{.    storeLa
1a5a0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1a5b0 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79  );   /* not a sy
1a5c0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1a5d0 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
1a5e0 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
1a5f0 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
1a600 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
1a610 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
1a620 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
1a630 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1a640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1a650 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
1a660 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a670 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65  seek the file-de
1a680 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20  scriptor passed 
1a690 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a6a0 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f  ument to.** abso
1a6b0 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66  lute offset iOff
1a6c0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
1a6d0 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74  o write nBuf byt
1a6e0 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a  es of data from.
1a6f0 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49  ** pBuf to it. I
1a700 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a710 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64  s, return -1 and
1a720 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f   set *piErrno. O
1a730 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65  therwise, .** re
1a740 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20  turn the actual 
1a750 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a760 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d  written (which m
1a770 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a  ay be less than.
1a780 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61  ** nBuf)..*/.sta
1a790 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a7a0 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64  riteFd(.  int fd
1a7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a7d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1a7e0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1a7f0 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a810 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20   File offset to 
1a820 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
1a830 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1a840 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1a850 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
1a860 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1a870 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fer to the file 
1a880 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20  */.  int nBuf,  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a8b0 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62  buffer pBuf in b
1a8c0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
1a8d0 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20  iErrno          
1a8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a8f0 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69  : Error number i
1a900 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  f error occurs *
1a910 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a920 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a930 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1a940 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74  returned by syst
1a950 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73  em call */..  as
1a960 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75  sert( nBuf==(nBu
1a970 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  f&0x1ffff) );.  
1a980 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a  assert( fd>2 );.
1a990 20 20 61 73 73 65 72 74 28 20 70 69 45 72 72 6e    assert( piErrn
1a9a0 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26  o!=0 );.  nBuf &
1a9b0 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
1a9c0 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64  ER_START;..#if d
1a9d0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a9e0 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1a9f0 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70  t)osPwrite(fd, p
1aa00 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1aa10 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
1aa20 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1aa30 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1aa40 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
1aa50 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
1aa60 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66  write64(fd, pBuf
1aa70 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77  , nBuf, iOff);}w
1aa80 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1aa90 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c  rno==EINTR);.#el
1aaa0 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  se.  do{.    i64
1aab0 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66   iSeek = lseek(f
1aac0 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45  d, iOff, SEEK_SE
1aad0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1aae0 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d  IOError( iSeek =
1aaf0 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69   -1 );.    if( i
1ab00 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20  Seek<0 ){.      
1ab10 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  rc = -1;.      b
1ab20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ab30 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
1ab40 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   pBuf, nBuf);.  
1ab50 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1ab60 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1ab70 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f  #endif..  TIMER_
1ab80 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
1ab90 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
1aba0 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
1abb0 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54   fd, rc, iOff, T
1abc0 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
1abd0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70  .  if( rc<0 ) *p
1abe0 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  iErrno = errno;.
1abf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ac00 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1ac10 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
1ac20 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
1ac30 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
1ac40 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
1ac50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ac60 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
1ac70 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
1ac80 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
1ac90 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
1aca0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
1acb0 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
1acc0 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
1acd0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
1ace0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1acf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ad00 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
1ad10 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
1ad20 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
1ad30 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1ad40 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b  ){.  return seek
1ad50 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68  AndWriteFd(id->h
1ad60 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1ad70 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72  cnt, &id->lastEr
1ad80 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rno);.}.../*.** 
1ad90 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
1ada0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
1adb0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
1adc0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1add0 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
1ade0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
1adf0 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
1ae00 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69  atic int unixWri
1ae10 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
1ae20 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74  le *id, .  const
1ae30 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1ae40 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1ae50 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
1ae60 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
1ae70 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1ae80 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f  e*)id;.  int wro
1ae90 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
1aea0 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
1aeb0 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1aec0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1aed0 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1aee0 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1aef0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1af00 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1af10 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1af20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1af30 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1af40 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1af50 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1af60 28 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  ( pFile->pPreall
1af70 6f 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a  ocatedUnused==0.
1af80 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1af90 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1afa0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1afb0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1afc0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1afd0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1afe0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1aff0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1b000 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1b010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1b020 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1b030 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1b040 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1b050 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1b060 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1b070 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1b080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1b090 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1b0a0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1b0b0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1b0c0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1b0d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b0e0 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1b0f0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1b100 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1b110 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1b120 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1b130 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1b140 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1b150 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1b160 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1b170 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1b180 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1b190 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1b1a0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1b1b0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1b1c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b1d0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1b1e0 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1b1f0 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1b200 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1b210 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b220 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1b230 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1b240 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1b250 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1b260 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1b270 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1b280 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1b290 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1b2a0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b2b0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1b2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b2d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1b2e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50  ined(SQLITE_MMAP
1b2f0 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53  _READWRITE) && S
1b300 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1b310 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
1b320 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
1b330 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
1b340 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
1b350 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
1b360 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
1b370 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
1b380 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
1b390 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1b3a0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1b3b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
1b3c0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
1b3d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1b3e0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
1b3f0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1b400 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1b410 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
1b420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b430 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1b440 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
1b450 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1b460 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1b470 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1b480 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1b490 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1b4a0 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
1b4b0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
1b4c0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
1b4d0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
1b4e0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
1b4f0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
1b500 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77    }.#endif. .  w
1b510 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73  hile( (wrote = s
1b520 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1b530 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
1b540 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72   amt))<amt && wr
1b550 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  ote>0 ){.    amt
1b560 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
1b570 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
1b580 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
1b590 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
1b5a0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
1b5b0 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
1b5c0 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
1b5d0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1b5e0 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
1b5f0 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20  0, amt=1 ));..  
1b600 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b  if( amt>wrote ){
1b610 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
1b620 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   && pFile->lastE
1b630 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a  rrno!=ENOSPC ){.
1b640 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72        /* lastErr
1b650 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1b660 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1b670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1b680 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
1b690 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72  else{.      stor
1b6a0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1b6b0 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73  , 0); /* not a s
1b6c0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1b6d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b6e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1b6f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1b700 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1b710 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1b720 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1b730 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
1b740 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
1b750 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
1b760 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
1b770 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
1b780 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72  syncs are occurr
1b790 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
1b7a0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
1b7b0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
1b7c0 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
1b7d0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1b7e0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1b7f0 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74  *.** We do not t
1b800 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20  rust systems to 
1b810 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e  provide a workin
1b820 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20  g fdatasync().  
1b830 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65  Some do..** Othe
1b840 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65  rs do no.  To be
1b850 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73   safe, we will s
1b860 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73  tick with the (s
1b870 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a  lightly slower).
1b880 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79  ** fsync(). If y
1b890 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
1b8a0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
1b8b0 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
1b8c0 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
1b8d0 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
1b8e0 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
1b8f0 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f  sync=fdatasync o
1b900 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59  r -DHAVE_FDATASY
1b910 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  NC.*/.#if !defin
1b920 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26  ed(fdatasync) &&
1b930 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43   !HAVE_FDATASYNC
1b940 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1b950 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1b960 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1b970 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1b980 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1b990 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1b9a0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1b9b0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1b9c0 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1b9d0 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1b9e0 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1b9f0 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1ba00 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1ba10 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1ba20 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1ba30 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1ba40 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1ba50 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1ba60 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1ba70 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
1ba80 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
1ba90 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
1baa0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
1bab0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
1bac0 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
1bad0 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
1bae0 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
1baf0 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
1bb00 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
1bb10 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1bb20 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
1bb30 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
1bb40 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
1bb50 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
1bb60 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
1bb70 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
1bb80 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
1bb90 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
1bba0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
1bbb0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
1bbc0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1bbd0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
1bbe0 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
1bbf0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1bc00 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
1bc10 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
1bc20 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
1bc30 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
1bc40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1bc50 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
1bc60 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
1bc70 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
1bc80 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
1bc90 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
1bca0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
1bcb0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
1bcc0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
1bcd0 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
1bce0 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
1bcf0 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
1bd00 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
1bd10 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
1bd20 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
1bd30 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
1bd40 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
1bd50 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
1bd60 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
1bd70 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
1bd80 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1bd90 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
1bda0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
1bdb0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
1bdc0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
1bdd0 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
1bde0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
1bdf0 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
1be00 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
1be10 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
1be20 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1be30 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
1be40 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
1be50 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
1be60 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
1be70 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
1be80 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
1be90 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
1bea0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
1beb0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
1bec0 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
1bed0 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
1bee0 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
1bef0 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
1bf00 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
1bf10 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
1bf20 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
1bf30 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
1bf40 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
1bf50 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
1bf60 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
1bf70 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
1bf80 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
1bf90 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
1bfa0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
1bfb0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1bfc0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1bfd0 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
1bfe0 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
1bff0 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
1c000 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
1c010 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
1c020 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
1c030 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
1c040 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
1c050 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
1c060 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
1c070 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
1c080 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
1c090 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1c0a0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
1c0b0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
1c0c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1c0d0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1c0e0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1c0f0 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
1c100 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
1c110 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
1c120 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
1c130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c140 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1c150 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c160 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
1c170 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
1c180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
1c190 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
1c1a0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
1c1b0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
1c1c0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
1c1d0 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
1c1e0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1c1f0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
1c200 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
1c210 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
1c220 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
1c230 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1c240 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
1c250 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
1c260 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
1c270 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
1c280 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
1c290 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
1c2a0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
1c2b0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
1c2c0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
1c2d0 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20   a.  ** no-op.  
1c2e0 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e 64  But go ahead and
1c2f0 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   call fstat() to
1c300 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66 69   validate the fi
1c310 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
1c320 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61 20  or as we need a 
1c330 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f 6b  method to provok
1c340 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72 69  e a failure duri
1c350 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74 65  ng.  ** coverate
1c360 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23   testing..  */.#
1c370 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1c380 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74 72  SYNC.  {.    str
1c390 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
1c3a0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
1c3b0 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23 65  d, &buf);.  }.#e
1c3c0 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1c3d0 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  NC.  if( fullSyn
1c3e0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c ){.    rc = os
1c3f0 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  Fcntl(fd, F_FULL
1c400 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
1c410 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
1c420 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
1c430 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64  FULLFSYNC failed
1c440 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61  , fall back to a
1c450 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79  ttempting an fsy
1c460 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68  nc()..  ** It sh
1c470 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69  ouldn't be possi
1c480 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e  ble for fullfsyn
1c490 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65  c to fail on the
1c4a0 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c   local .  ** fil
1c4b0 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58  e system (on OSX
1c4c0 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e  ), so failure in
1c4d0 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c  dicates that FUL
1c4e0 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27  LFSYNC.  ** isn'
1c4f0 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
1c500 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d  this file system
1c510 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e  . So, attempt an
1c520 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64   fsync .  ** and
1c530 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72   (for now) ignor
1c540 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  e the overhead o
1c550 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20  f a superfluous 
1c560 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20  fcntl call.  .  
1c570 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65  ** It'd be bette
1c580 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c  r to detect full
1c590 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e  fsync support on
1c5a0 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20  ce and avoid .  
1c5b0 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c  ** the fcntl cal
1c5c0 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e  l every time syn
1c5d0 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  c is called..  *
1c5e0 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20  /.  if( rc ) rc 
1c5f0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65  = fsync(fd);..#e
1c600 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
1c610 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74  PLE__).  /* fdat
1c620 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20  async() on HFS+ 
1c630 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73  doesn't yet flus
1c640 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  h the file size 
1c650 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f  if it changed co
1c660 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20  rrectly.  ** so 
1c670 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66  currently we def
1c680 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72  ault to the macr
1c690 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73  o that redefines
1c6a0 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73   fdatasync to fs
1c6b0 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ync.  */.  rc = 
1c6c0 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65  fsync(fd);.#else
1c6d0 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79   .  rc = fdatasy
1c6e0 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56  nc(fd);.#if OS_V
1c6f0 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d  XWORKS.  if( rc=
1c700 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  =-1 && errno==EN
1c710 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20  OTSUP ){.    rc 
1c720 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d  = fsync(fd);.  }
1c730 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
1c740 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20  WORKS */.#endif 
1c750 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /* ifdef SQLITE_
1c760 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56  NO_SYNC elif HAV
1c770 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a  E_FULLFSYNC */..
1c780 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53    if( OS_VXWORKS
1c790 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20   && rc!= -1 ){. 
1c7a0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
1c7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c7c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1c7d0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
1c7e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1c7f0 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69  taining file zFi
1c800 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75  lename..** If su
1c810 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69  ccessful, *pFd i
1c820 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65  s set to the ope
1c830 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ned file descrip
1c840 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  tor and.** SQLIT
1c850 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c860 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1c870 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c  curs, either SQL
1c880 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20  ITE_NOMEM.** or 
1c890 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1c8a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c8b0 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61  *pFd is set to a
1c8c0 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76  n undefined.** v
1c8d0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alue..**.** The 
1c8e0 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
1c8f0 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65  escriptor is use
1c900 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74  d for only one t
1c910 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79  hing - to.** fsy
1c920 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79  nc() a directory
1c930 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69   to make sure fi
1c940 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  le creation and 
1c950 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a  deletion events.
1c960 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ** are flushed t
1c970 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73  o disk.  Such fs
1c980 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65  yncs are not nee
1c990 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20  ded on newer.** 
1c9a0 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73  journaling files
1c9b0 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20  ystems, but are 
1c9c0 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65  required on olde
1c9d0 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  r filesystems..*
1c9e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c9f0 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
1ca00 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53  den using the xS
1ca10 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66  etSysCall interf
1ca20 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c  ace..** The abil
1ca30 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20  ity to override 
1ca40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1ca50 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72   added in suppor
1ca60 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f  t of the.** chro
1ca70 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f  mium sandbox.  O
1ca80 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f  pening a directo
1ca90 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79  ry is a security
1caa0 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a   risk (we are.**
1cab0 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67   told) so making
1cac0 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65   it overrideable
1cad0 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f   allows the chro
1cae0 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a  mium sandbox to.
1caf0 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20  ** replace this 
1cb00 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68  routine with a h
1cb10 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20  armless no-op.  
1cb20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75  To make this rou
1cb30 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c  tine.** a no-op,
1cb40 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68   replace it with
1cb50 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74   a stub that ret
1cb60 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62  urns SQLITE_OK b
1cb70 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46  ut leaves.** *pF
1cb80 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74  d set to a negat
1cb90 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  ive number..**.*
1cba0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1cbb0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1cbc0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1cbd0 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e  sible for closin
1cbe0 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  g.** the file de
1cbf0 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73  scriptor *pFd us
1cc00 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a  ing close()..*/.
1cc10 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
1cc20 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
1cc30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1cc40 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74  int *pFd){.  int
1cc50 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   ii;.  int fd = 
1cc60 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e  -1;.  char zDirn
1cc70 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
1cc80 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  +1];..  sqlite3_
1cc90 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1cca0 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c  HNAME, zDirname,
1ccb0 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65   "%s", zFilename
1ccc0 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74  );.  for(ii=(int
1ccd0 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65  )strlen(zDirname
1cce0 29 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72 6e  ); ii>0 && zDirn
1ccf0 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69  ame[ii]!='/'; ii
1cd00 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20  --);.  if( ii>0 
1cd10 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ){.    zDirname[
1cd20 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65  ii] = '\0';.  }e
1cd30 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  lse{.    if( zDi
1cd40 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29 20  rname[0]!='/' ) 
1cd50 7a 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e  zDirname[0] = '.
1cd60 27 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b  ';.    zDirname[
1cd70 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 64  1] = 0;.  }.  fd
1cd80 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1cd90 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1cda0 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1cdb0 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1cdc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
1cdd0 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c  NDIR %-3d %s\n",
1cde0 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b   fd, zDirname));
1cdf0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1ce00 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20  ;.  if( fd>=0 ) 
1ce10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce20 3b 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c  ;.  return unixL
1ce30 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1ce40 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1ce50 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a  penDirectory", z
1ce60 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  Dirname);.}../*.
1ce70 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1ce80 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1ce90 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1cea0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1ceb0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1cec0 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1ced0 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1cee0 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1cef0 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1cf00 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1cf10 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1cf20 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1cf30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1cf40 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1cf50 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1cf60 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1cf70 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1cf80 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1cf90 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1cfa0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1cfb0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1cfc0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1cfd0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1cfe0 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
1cff0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
1d000 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
1d010 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
1d020 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
1d030 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
1d040 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
1d050 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
1d060 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
1d070 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
1d080 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
1d090 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
1d0a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
1d0b0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
1d0c0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1d0d0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1d0e0 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
1d0f0 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
1d100 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
1d110 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
1d120 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
1d130 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
1d140 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
1d150 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
1d160 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
1d170 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
1d180 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
1d190 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1d1a0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
1d1b0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
1d1c0 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
1d1d0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
1d1e0 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
1d1f0 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
1d200 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1d210 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
1d220 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
1d230 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
1d240 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
1d250 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
1d260 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1d270 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
1d280 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
1d290 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1d2a0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
1d2b0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
1d2c0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
1d2d0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1d2e0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
1d2f0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
1d300 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
1d310 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
1d320 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
1d330 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
1d340 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1d350 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1d360 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
1d370 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1d380 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
1d390 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
1d3a0 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
1d3b0 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
1d3c0 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
1d3d0 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
1d3e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d3f0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
1d400 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
1d410 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1d420 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
1d430 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1d440 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
1d450 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
1d460 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1d470 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
1d480 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
1d490 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1d4a0 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
1d4b0 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
1d4c0 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
1d4d0 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
1d4e0 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
1d4f0 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
1d500 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
1d510 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
1d520 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
1d530 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
1d540 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
1d550 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
1d560 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1d570 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
1d580 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
1d590 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1d5a0 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
1d5b0 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
1d5c0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
1d5d0 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
1d5e0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
1d5f0 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
1d600 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
1d610 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
1d620 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1d630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75  E_OK ){.      fu
1d650 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1d660 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1d670 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1d680 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1d690 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d6a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1d6b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1d6c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1d6d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d6e0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1d6f0 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
1d700 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20  _DIRSYNC;.  }.  
1d710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d720 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1d730 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
1d740 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
1d750 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d760 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1d770 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
1d780 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
1d790 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d7a0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d7b0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1d7c0 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
1d7d0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1d7e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1d7f0 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
1d800 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1d810 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1d820 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1d830 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
1d840 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
1d850 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
1d860 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
1d870 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
1d880 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
1d890 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
1d8a0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
1d8b0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
1d8c0 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
1d8d0 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
1d8e0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
1d8f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1d900 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1d910 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1d920 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1d930 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1d940 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1d950 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1d960 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1d970 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  ->h, nByte);.  i
1d980 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
1d990 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1d9a0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
1d9b0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1d9c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d9d0 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1d9e0 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1d9f0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23  ath);.  }else{.#
1da00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1da10 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1da20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1da30 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1da40 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1da50 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1da60 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1da70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1da80 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1da90 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1daa0 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1dab0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1dac0 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1dad0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1dae0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1daf0 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1db00 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1db10 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1db20 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1db30 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1db40 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1db50 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1db60 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1db70 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1db80 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1db90 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1dba0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1dbb0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1dbc0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1dbd0 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1dbe0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1dbf0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1dc00 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74  ZE>0.    /* If t
1dc10 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  he file was just
1dc20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
1dc30 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
1dc40 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
1dc50 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65      ** mapped re
1dc60 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
1dc70 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
1dc80 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
1dc90 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20   SQLite will.   
1dca0 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61   ** use read() a
1dcb0 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63  nd write() to ac
1dcc0 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64  cess data beyond
1dcd0 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d   this point from
1dce0 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a   now on.  .    *
1dcf0 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c  /.    if( nByte<
1dd00 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1dd10 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1dd20 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
1dd30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1dd40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dd50 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
1dd60 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
1dd70 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1dd80 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
1dd90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1dda0 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  nixFileSize(sqli
1ddb0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1ddc0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  4 *pSize){.  int
1ddd0 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74   rc;.  struct st
1dde0 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
1ddf0 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f  ( id );.  rc = o
1de00 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c  sFstat(((unixFil
1de10 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
1de20 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1de30 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1de40 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1de50 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1de60 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1de70 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1de80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1de90 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1dea0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1deb0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1dec0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1ded0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1dee0 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1def0 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1df00 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1df10 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1df20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1df30 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1df40 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1df50 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1df60 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1df70 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1df80 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1df90 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1dfa0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1dfb0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1dfc0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1dfd0 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1dfe0 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1dff0 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1e000 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1e010 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1e020 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1e030 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1e040 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1e050 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1e060 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1e070 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1e080 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1e090 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1e0a0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1e0b0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1e0c0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1e0d0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1e0e0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1e0f0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1e100 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1e110 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e120 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1e130 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1e140 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1e150 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1e160 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1e170 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1e180 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1e190 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1e1a0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1e1b0 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1e1c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1e1d0 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1e1e0 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1e1f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1e200 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1e210 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1e220 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1e230 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1e240 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1e250 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1e260 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1e280 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1e290 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1e2a0 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1e2b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1e2c0 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1e2d0 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1e2e0 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1e2f0 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1e300 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  buf) ){.      re
1e310 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e320 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a  R_FSTAT;.    }..
1e330 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42      nSize = ((nB
1e340 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75  yte+pFile->szChu
1e350 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73  nk-1) / pFile->s
1e360 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1e370 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66  >szChunk;.    if
1e380 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66  ( nSize>(i64)buf
1e390 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66  .st_size ){..#if
1e3a0 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
1e3b0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
1e3c0 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
1e3d0 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20  LOCATE.      /* 
1e3e0 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69  The code below i
1e3f0 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72  s handling the r
1e400 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f  eturn value of o
1e410 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20  sFallocate() .  
1e420 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
1e430 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  . posix_fallocat
1e440 65 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  e() is defined t
1e450 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  o "returns zero 
1e460 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20  on success, .   
1e470 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f     ** or an erro
1e480 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69  r number on  fai
1e490 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d  lure". See the m
1e4a0 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74 61 69  anpage for detai
1e4b0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ls. */.      int
1e4c0 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a   err;.      do{.
1e4d0 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73          err = os
1e4e0 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d  Fallocate(pFile-
1e4f0 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c  >h, buf.st_size,
1e500 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69   nSize-buf.st_si
1e510 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ze);.      }whil
1e520 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b  e( err==EINTR );
1e530 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
1e540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e550 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73  OERR_WRITE;.#els
1e560 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  e.      /* If th
1e570 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61  e OS does not ha
1e580 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  ve posix_falloca
1e590 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57  te(), fake it. W
1e5a0 72 69 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a  rite a .      **
1e5b0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
1e5c0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e  the last byte in
1e5d0 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74   each block that
1e5e0 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a   falls entirely.
1e5f0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20        ** within 
1e600 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67  the extended reg
1e610 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65  ion. Then, if re
1e620 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65  quired, a single
1e630 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61   byte.      ** a
1e640 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d  t offset (nSize-
1e650 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73  1), to set the s
1e660 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1e670 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20  correctly..     
1e680 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 69   ** This is a si
1e690 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20  milar technique 
1e6a0 74 6f 20 74 68 61 74 20 75 73 65 64 20 62 79 20  to that used by 
1e6b0 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73  glibc on systems
1e6c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64  .      ** that d
1e6d0 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61  o not have a rea
1e6e0 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61  l fallocate() ca
1e6f0 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1e700 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1e710 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1e720 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1e730 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1e740 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
1e750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e760 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e770 20 77 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b   written by seek
1e780 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  AndWrite */.    
1e790 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7b0 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1e7c0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1e7d0 20 20 20 69 57 72 69 74 65 20 3d 20 28 62 75 66     iWrite = (buf
1e7e0 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e  .st_size/nBlk)*n
1e7f0 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a  Blk + nBlk - 1;.
1e800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 57        assert( iW
1e810 72 69 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a  rite>=buf.st_siz
1e820 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1e830 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
1e840 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
1e850 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
1e860 69 57 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c  iWrite<nSize+nBl
1e870 6b 2d 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c  k-1; iWrite+=nBl
1e880 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  k ){.        if(
1e890 20 69 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29   iWrite>=nSize )
1e8a0 20 69 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20   iWrite = nSize 
1e8b0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72  - 1;.        nWr
1e8c0 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1e8d0 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1e8e0 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1e8f0 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1e900 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e910 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1e920 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e930 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  }.  }..#if SQLIT
1e940 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1e950 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d  0.  if( pFile->m
1e960 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20  mapSizeMax>0 && 
1e970 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61  nByte>pFile->mma
1e980 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  pSize ){.    int
1e990 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69   rc;.    if( pFi
1e9a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29  le->szChunk<=0 )
1e9b0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  {.      if( robu
1e9c0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1e9d0 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b  le->h, nByte) ){
1e9e0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
1e9f0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
1ea00 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
1ea10 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
1ea20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1ea30 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
1ea40 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
1ea50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1ea60 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e    }..    rc = un
1ea70 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  ixMapfile(pFile,
1ea80 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74   nByte);.    ret
1ea90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
1eaa0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
1eab0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1eac0 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69   If *pArg is ini
1ead0 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1eae0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1eaf0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1eb00 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1eb10 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1eb20 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1eb30 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1eb40 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1eb50 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1eb60 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1eb70 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1eb80 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1eb90 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1eba0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
1ebb0 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65  ModeBit(unixFile
1ebc0 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1ebd0 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1ebe0 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1ebf0 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1ec00 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1ec10 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1ec20 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1ec30 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1ec40 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1ec50 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1ec60 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1ec70 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1ec80 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1ec90 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1eca0 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1ecb0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1ecc0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1ecd0 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  zBuf);../*.** In
1ece0 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f  formation and co
1ecf0 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e  ntrol of an open
1ed00 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1ed10 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1ed20 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1ed30 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1ed40 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1ed50 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1ed60 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1ed70 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20  *)id;.  switch( 
1ed80 6f 70 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  op ){.#if define
1ed90 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
1eda0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1edb0 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
1edc0 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20 63 61  IC_WRITE).    ca
1edd0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ede0 42 45 47 49 4e 5f 41 54 4f 4d 49 43 5f 57 52 49  BEGIN_ATOMIC_WRI
1edf0 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
1ee00 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
1ee10 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
1ee20 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49  START_ATOMIC_WRI
1ee30 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  TE);.      retur
1ee40 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49 4f  n rc ? SQLITE_IO
1ee50 45 52 52 5f 42 45 47 49 4e 5f 41 54 4f 4d 49 43  ERR_BEGIN_ATOMIC
1ee60 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   : SQLITE_OK;.  
1ee70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1ee80 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
1ee90 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b  _ATOMIC_WRITE: {
1eea0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1eeb0 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68  osIoctl(pFile->h
1eec0 2c 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d 4d 49  , F2FS_IOC_COMMI
1eed0 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b  T_ATOMIC_WRITE);
1eee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1eef0 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
1ef00 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 20 3a 20  COMMIT_ATOMIC : 
1ef10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ef20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ef30 5f 46 43 4e 54 4c 5f 52 4f 4c 4c 42 41 43 4b 5f  _FCNTL_ROLLBACK_
1ef40 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a  ATOMIC_WRITE: {.
1ef50 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f        int rc = o
1ef60 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sIoctl(pFile->h,
1ef70 20 46 32 46 53 5f 49 4f 43 5f 41 42 4f 52 54 5f   F2FS_IOC_ABORT_
1ef80 56 4f 4c 41 54 49 4c 45 5f 57 52 49 54 45 29 3b  VOLATILE_WRITE);
1ef90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1efa0 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
1efb0 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 20  ROLLBACK_ATOMIC 
1efc0 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  : SQLITE_OK;.   
1efd0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c   }.#endif /* __l
1efe0 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45  inux__ && SQLITE
1eff0 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
1f000 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20  OMIC_WRITE */.. 
1f010 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f020 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1f030 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1f040 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69  Arg = pFile->eFi
1f050 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65  leLock;.      re
1f060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f070 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54  QLITE_FCNTL_LAST
1f090 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
1f0a0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1f0b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1f0c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f0d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f0e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f0f0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
1f100 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f110 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
1f120 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1f130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f140 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f150 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1f160 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  HINT: {.      in
1f170 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75  t rc;.      Simu
1f180 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1f190 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1f1a0 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70   fcntlSizeHint(p
1f1b0 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41  File, *(i64 *)pA
1f1c0 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  rg);.      Simul
1f1d0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1f1e0 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (0);.      retur
1f1f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f200 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f210 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1f220 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1f230 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1f240 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
1f250 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1f260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f270 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f280 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f290 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1f2a0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  RITE: {.      un
1f2b0 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1f2c0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20   UNIXFILE_PSOW, 
1f2d0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
1f2e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f2f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f300 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f310 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1f320 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1f330 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1f340 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1f350 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1f360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f370 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f380 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f390 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1f3a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1f3b0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
1f3c0 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70  lloc64( pFile->p
1f3d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1f3e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46  );.      if( zTF
1f3f0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ile ){.        u
1f400 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
1f410 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1f420 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b  thname, zTFile);
1f430 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
1f440 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
1f450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1f460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f470 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f480 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
1f490 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20  _MOVED: {.      
1f4a0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69  *(int*)pArg = fi
1f4b0 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
1f4c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f4d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f4e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1f4f0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1f500 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f510 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1f520 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1f530 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1f540 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1f550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1f560 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
1f570 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f580 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
1f590 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
1f5a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f5b0 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
1f5c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
1f5d0 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d   value of newLim
1f5e0 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75  it may be eventu
1f5f0 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28 73 69  ally cast to (si
1f600 7a 65 5f 74 29 20 61 6e 64 20 70 61 73 73 65 64  ze_t) and passed
1f610 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61  .      ** to mma
1f620 70 28 29 2e 20 52 65 73 74 72 69 63 74 20 69 74  p(). Restrict it
1f630 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69  s value to 2GB i
1f640 66 20 28 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f  f (size_t) is no
1f650 74 20 61 74 20 6c 65 61 73 74 20 61 0a 20 20 20  t at least a.   
1f660 20 20 20 2a 2a 20 36 34 2d 62 69 74 20 74 79 70     ** 64-bit typ
1f670 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
1f680 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69  newLimit>0 && si
1f690 7a 65 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20 29  zeof(size_t)<8 )
1f6a0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1f6b0 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26  it = (newLimit &
1f6c0 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20   0x7FFFFFFF);.  
1f6d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69      }..      *(i
1f6e0 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
1f6f0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1f700 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1f710 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
1f720 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
1f730 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
1f740 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
1f750 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1f760 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
1f770 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
1f780 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1f790 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1f7a0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
1f7b0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
1f7c0 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1f7d0 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
1f7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f7f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f800 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1f810 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1f820 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1f830 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1f840 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1f850 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1f860 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1f870 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1f880 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1f890 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1f8a0 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1f8b0 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1f8c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f8d0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1f8e0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1f8f0 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1f900 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f910 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1f920 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1f930 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1f940 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1f950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f960 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1f970 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f980 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1f990 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1f9a0 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1f9b0 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
1f9c0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
1f9d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f9e0 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
1f9f0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1fa00 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1fa10 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1fa20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1fa30 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1fa40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1fa50 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1fa60 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
1fa70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1fa80 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  OUND;.}../*.** I
1fa90 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
1faa0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  e is non-zero wh
1fab0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1fac0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
1fad0 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
1fae0 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c  herwise, the val
1faf0 75 65 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74  ues of pFd->sect
1fb00 6f 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70  orSize and .** p
1fb10 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  Fd->deviceCharac
1fb20 74 65 72 69 73 74 69 63 73 20 61 72 65 20 73 65  teristics are se
1fb30 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  t according to t
1fb40 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
1fb50 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
1fb60 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  cs. .**.** There
1fb70 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
1fb80 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
1fb90 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20  on. One for QNX 
1fba0 61 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a  and one for all.
1fbb0 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  ** other systems
1fbc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
1fbd0 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76  NXNTO__.static v
1fbe0 6f 69 64 20 73 65 74 44 65 76 69 63 65 43 68 61  oid setDeviceCha
1fbf0 72 61 63 74 65 72 69 73 74 69 63 73 28 75 6e 69  racteristics(uni
1fc00 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
1fc10 73 73 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69  ssert( pFd->devi
1fc20 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fc30 73 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63  s==0 || pFd->sec
1fc40 74 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  torSize!=0 );.  
1fc50 69 66 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53  if( pFd->sectorS
1fc60 69 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  ize==0 ){.#if de
1fc70 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
1fc80 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1fc90 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
1fca0 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20  ATOMIC_WRITE).  
1fcb0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75    int res;.    u
1fcc0 33 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  32 f = 0;..    /
1fcd0 2a 20 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70  * Check for supp
1fce0 6f 72 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f  ort for F2FS ato
1fcf0 6d 69 63 20 62 61 74 63 68 20 77 72 69 74 65 73  mic batch writes
1fd00 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f  . */.    res = o
1fd10 73 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46  sIoctl(pFd->h, F
1fd20 32 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54  2FS_IOC_GET_FEAT
1fd30 55 52 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69  URES, &f);.    i
1fd40 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20  f( res==0 && (f 
1fd50 26 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41  & F2FS_FEATURE_A
1fd60 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a  TOMIC_WRITE) ){.
1fd70 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63        pFd->devic
1fd80 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fd90 20 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   = SQLITE_IOCAP_
1fda0 42 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20  BATCH_ATOMIC;.  
1fdb0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f    }.#endif /* __
1fdc0 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54  linux__ && SQLIT
1fdd0 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
1fde0 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a  TOMIC_WRITE */..
1fdf0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50      /* Set the P
1fe00 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1fe10 54 45 20 66 6c 61 67 20 69 66 20 72 65 71 75 65  TE flag if reque
1fe20 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
1fe30 20 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20   pFd->ctrlFlags 
1fe40 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  & UNIXFILE_PSOW 
1fe50 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65  ){.      pFd->de
1fe60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fe70 69 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f  ics |= SQLITE_IO
1fe80 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1fe90 45 52 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a  ERWRITE;.    }..
1fea0 20 20 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53      pFd->sectorS
1feb0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1fec0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fed0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69  ;.  }.}.#else.#i
1fee0 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64  nclude <sys/dcmd
1fef0 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _blk.h>.#include
1ff00 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e   <sys/statvfs.h>
1ff10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1ff20 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1ff30 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a  stics(unixFile *
1ff40 70 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46  pFile){.  if( pF
1ff50 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1ff60 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75  == 0 ){.    stru
1ff70 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66  ct statvfs fsInf
1ff80 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f  o;.       .    /
1ff90 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66  * Set defaults f
1ffa0 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64  or non-supported
1ffb0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a   filesystems */.
1ffc0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1ffd0 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1ffe0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1fff0 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  ZE;.    pFile->d
20000 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20010 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  tics = 0;.    if
20020 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65  ( fstatvfs(pFile
20030 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ->h, &fsInfo) ==
20040 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65   -1 ) {.      re
20050 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74  turn pFile->sect
20060 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  orSize;.    }.. 
20070 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66     if( !strcmp(f
20080 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
20090 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20  , "tmp") ) {.   
200a0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
200b0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
200c0 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
200d0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
200e0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
200f0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20100 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20  _ATOMIC4K |     
20110 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c    /* All ram fil
20120 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
20130 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
20140 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20150 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
20160 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
20170 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
20180 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
201c0 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
201d0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
201e0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
201f0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
20200 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
20210 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20240 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
20250 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
20260 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
20270 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
20280 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73  _basetype, "etfs
20290 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
202a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
202b0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
202c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
202d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
202e0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
202f0 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a  etfs cluster siz
20300 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  e writes are ato
20310 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  mic */.        (
20320 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
20330 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
20340 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
20350 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  ) |.        SQLI
20360 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
20370 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
20380 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
20390 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
203a0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
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 20 2a 2a 20 74 68 65 20           ** the 
203d0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
203e0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
203f0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
20400 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
20410 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
20420 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
20430 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
20460 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
20470 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
20480 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
20490 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
204a0 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20  e, "qnx6") ){.  
204b0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
204c0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
204d0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
204e0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
204f0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
20500 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20510 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20  P_ATOMIC |      
20520 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79     /* All filesy
20530 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
20540 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
20550 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
20560 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
20570 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
20580 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
20590 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
205c0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
205d0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
205e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
205f0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
20600 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
20610 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
20620 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20650 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
20660 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
20670 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
20680 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
20690 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29  asetype, "qnx4")
206a0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
206b0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
206c0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
206d0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
206e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
206f0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
20700 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
20710 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
20720 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
20730 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
20740 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
20750 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
20760 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
20770 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
20780 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
20790 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
207a0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
207b0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
207c0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
207d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
20800 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
20810 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
20820 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
20830 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
20840 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20   "dos") ){.     
20850 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20860 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
20870 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
20880 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20890 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
208a0 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
208b0 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
208c0 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
208d0 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
208e0 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
208f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
20900 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
20910 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
20920 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
20930 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
20940 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
20950 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
20960 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
20970 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
209a0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
209b0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
209c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
209d0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
209e0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
209f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20a00 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c  OCAP_ATOMIC512 |
20a10 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20        /* blocks 
20a20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
20a30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20a40 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
20a50 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
20a60 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
20a70 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
20ab0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
20ac0 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d      0;.    }.  }
20ad0 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63  .  /* Last chanc
20ae0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20  e verification. 
20af0 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   If the sector s
20b00 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74  ize isn't a mult
20b10 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a  iple of 512.  **
20b20 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76   then it isn't v
20b30 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46  alid.*/.  if( pF
20b40 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20b50 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20  % 512 != 0 ){.  
20b60 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20b70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20b80 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   0;.    pFile->s
20b90 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
20ba0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
20bb0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65  R_SIZE;.  }.}.#e
20bc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
20bd0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
20be0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
20bf0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
20c00 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
20c10 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
20c20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
20c30 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
20c40 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
20c50 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
20c60 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
20c70 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
20c80 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
20c90 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
20ca0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
20cb0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
20cc0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
20cd0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
20ce0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
20cf0 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
20d00 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
20d10 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
20d20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
20d30 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
20d40 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
20d50 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
20d60 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
20d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
20d80 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
20d90 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
20da0 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43  id;.  setDeviceC
20db0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
20dc0 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  Fd);.  return pF
20dd0 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d  d->sectorSize;.}
20de0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20df0 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
20e00 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
20e10 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
20e20 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70  is VFS is set up
20e30 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
20e40 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
20e50 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64  E_OVERWRITE by d
20e60 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76  efault..** Howev
20e70 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20  er, that choice 
20e80 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c  is controversial
20e90 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c   since technical
20ea0 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ly the underlyin
20eb0 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d  g.** file system
20ec0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73   does not always
20ed0 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61   provide powersa
20ee0 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20  fe overwrites.  
20ef0 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72  (In other.** wor
20f00 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65  ds, after a powe
20f10 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61  r-loss event, pa
20f20 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20  rts of the file 
20f30 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a  that were never.
20f40 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  ** written might
20f50 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c   end up being al
20f60 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72  tered.)  However
20f70 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76  , non-PSOW behav
20f80 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20  ior is very,.** 
20f90 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20  very rare.  And 
20fa0 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d  asserting PSOW m
20fb0 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64  akes a large red
20fc0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d  uction in the am
20fd0 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69  ount.** of requi
20fe0 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72  red I/O for jour
20ff0 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20  naling, since a 
21000 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69  lot of padding i
21010 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a  s eliminated..**
21020 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50    Hence, while P
21030 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
21040 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  TE is on by defa
21050 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20  ult, there is a 
21060 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  file-control.** 
21070 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
21080 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49  n it off and URI
21090 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
210a0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
210b0 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74  rn it off..*/.st
210c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
210d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
210e0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
210f0 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
21100 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
21110 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69  e*)id;.  setDevi
21120 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21130 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e  s(pFd);.  return
21140 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
21150 61 63 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a  acteristics;.}..
21160 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
21170 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
21180 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21190 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52  _SIZE>0../*.** R
211a0 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d  eturn the system
211b0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
211c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
211d0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
211e0 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  lled directly by
211f0 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74   other code in t
21200 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e  his file. .** In
21210 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64  stead, it should
21220 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d   be called via m
21230 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69  acro osGetpagesi
21240 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ze()..*/.static 
21250 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73  int unixGetpages
21260 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f  ize(void){.#if O
21270 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
21280 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64  rn 1024;.#elif d
21290 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52  efined(_BSD_SOUR
212a0 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74  CE).  return get
212b0 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73  pagesize();.#els
212c0 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  e.  return (int)
212d0 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45  sysconf(_SC_PAGE
212e0 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  SIZE);.#endif.}.
212f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
21300 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21310 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
21320 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
21330 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
21340 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a  E_OMIT_WAL../*.*
21350 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
21360 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
21370 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
21380 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
21390 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
213a0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
213b0 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
213c0 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
213d0 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
213e0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
213f0 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
21400 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
21410 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
21420 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
21430 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
21440 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
21450 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
21460 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
21470 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
21480 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
21490 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
214a0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
214b0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
214c0 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
214d0 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
214e0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
214f0 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
21500 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
21510 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
21520 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
21530 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
21540 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
21550 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
21560 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
21570 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
21580 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
21590 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
215a0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
215b0 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
215c0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
215d0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
215e0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
215f0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
21600 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
21610 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
21620 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
21630 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
21640 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
21650 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
21660 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
21670 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
21680 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
21690 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
216a0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
216b0 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
216c0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
216d0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
216e0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
216f0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
21700 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
21710 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
21720 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
21730 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
21740 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
21750 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
21760 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
21770 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
21780 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
21790 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
217a0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
217b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
217c0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
217d0 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
217e0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
217f0 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
21800 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
21810 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
21820 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
21830 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
21840 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
21850 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
21860 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
21870 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21880 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
21890 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
218c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
218d0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218f0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
21900 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
21910 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21930 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
21940 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
21950 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
21960 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21970 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
21980 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
21990 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
219a0 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
219b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
219c0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
219d0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
219e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
219f0 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
21a00 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
21a10 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
21a20 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
21a30 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
21a40 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
21a50 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
21a60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
21a70 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
21a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21a90 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
21aa0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
21ab0 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
21ac0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
21ad0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
21ae0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
21af0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b10 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
21b20 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
21b30 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
21b40 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
21b50 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
21b60 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
21b70 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
21b80 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
21b90 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
21ba0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
21bb0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
21bc0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
21bd0 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
21be0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
21bf0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
21c00 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
21c10 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
21c20 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
21c30 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
21c40 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
21c50 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
21c60 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
21c70 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
21c80 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
21c90 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
21ca0 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
21cb0 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
21cc0 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
21cd0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
21ce0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
21cf0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
21d00 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
21d10 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
21d20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
21d30 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
21d40 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
21d50 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21d70 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
21d80 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
21d90 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
21da0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
21db0 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
21dc0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
21dd0 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
21de0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
21df0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
21e00 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
21e10 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
21e20 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
21e30 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
21e40 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
21e50 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
21e60 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
21e70 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
21e80 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
21e90 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
21ea0 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
21eb0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
21ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
21ed0 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
21ee0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
21ef0 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
21f00 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
21f10 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
21f20 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
21f30 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
21f40 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
21f50 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
21f60 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
21f70 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
21f80 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
21f90 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
21fa0 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
21fb0 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
21fc0 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
21fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21fe0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
21ff0 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
22000 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70  ile,       /* Op
22010 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  en connection to
22020 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f   the WAL file */
22030 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
22040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55            /* F_U
22050 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f  NLCK, F_RDLCK, o
22060 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  r F_WRLCK */.  i
22070 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
22080 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
22090 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  yte of the locki
220a0 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  ng range */.  in
220b0 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  t n             
220c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
220d0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
220e0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  */.){.  unixShmN
220f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
22100 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
22110 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
22120 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
22130 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
22140 63 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  ck f;        /* 
22150 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
22160 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
22170 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
22180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22190 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
221a0 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
221b0 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
221c0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
221d0 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
221e0 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
221f0 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65  er */.  pShmNode
22200 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
22210 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
22220 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22230 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
22240 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68  e->mutex) || pSh
22250 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
22260 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c  ;..  /* Shared l
22270 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20  ocks never span 
22280 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79  more than one by
22290 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
222a0 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65  n==1 || lockType
222b0 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20  !=F_RDLCK );..  
222c0 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74  /* Locks are wit
222d0 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61  hin range */.  a
222e0 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e  ssert( n>=1 && n
222f0 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
22300 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  CK );..  if( pSh
22310 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
22320 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
22330 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
22340 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d  ameters */.    m
22350 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a  emset(&f, 0, siz
22360 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c  eof(f));.    f.l
22370 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65  _type = lockType
22380 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65  ;.    f.l_whence
22390 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
223a0 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73   f.l_start = ofs
223b0 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d  t;.    f.l_len =
223c0 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73   n;..    rc = os
223d0 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fcntl(pShmNode->
223e0 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b  h, F_SETLK, &f);
223f0 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28  .    rc = (rc!=(
22400 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  -1)) ? SQLITE_OK
22410 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
22420 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
22430 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b   the global lock
22440 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65   state and do de
22450 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  bug tracing */.#
22460 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22470 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b  UG.  { u16 mask;
22480 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
22490 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73  -LOCK "));.  mas
224a0 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78  k = ofst>31 ? 0x
224b0 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74  ffff : (1<<(ofst
224c0 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
224d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
224e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
224f0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
22500 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
22510 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
22520 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
22530 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
22540 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
22550 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
22560 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
22570 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
22580 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
22590 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
225a0 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
225b0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
225c0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
225d0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
225e0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
225f0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
22600 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
22610 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
22620 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
22630 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
22640 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
22650 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
22660 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
22670 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
22680 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
22690 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
226a0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
226b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
226c0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
226d0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
226e0 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
226f0 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
22700 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
22710 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
22720 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
22730 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
22740 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
22750 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
22760 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
22770 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
22780 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
22790 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
227a0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
227b0 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
227c0 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
227d0 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
227e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
227f0 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
22800 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
22810 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
22820 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
22830 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22840 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65  he minimum numbe
22850 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65  r of 32KB shm re
22860 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c  gions that shoul
22870 64 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a  d be mapped at.*
22880 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69  * a time, assumi
22890 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d 61 70  ng that each map
228a0 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20  ping must be an 
228b0 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
228c0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
228d0 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73  nt system page-s
228e0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c  ize..**.** Usual
228f0 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54  ly, this is 1. T
22900 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65  he exception see
22910 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73  ms to be systems
22920 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67   that are config
22930 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36  ured.** to use 6
22940 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74  4KB pages - in t
22950 68 69 73 20 63 61 73 65 20 65 61 63 68 20 6d 61  his case each ma
22960 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72  pping must cover
22970 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a   at least two.**
22980 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f   shm regions..*/
22990 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
229a0 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
229b0 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d  void){.  int shm
229c0 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20  sz = 32*1024;   
229d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20           /* SHM 
229e0 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20  region size */. 
229f0 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65   int pgsz = osGe
22a00 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f  tpagesize();   /
22a10 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20 73 69  * System page si
22a20 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ze */.  assert( 
22a30 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d  ((pgsz-1)&pgsz)=
22a40 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20  =0 );   /* Page 
22a50 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
22a60 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69  ower of 2 */.  i
22a70 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20  f( pgsz<shmsz ) 
22a80 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
22a90 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d  rn pgsz/shmsz;.}
22aa0 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
22ab0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73  e unixShmNodeLis
22ac0 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
22ad0 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53  tries with unixS
22ae0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
22af0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
22b00 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
22b10 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
22b20 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
22b30 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
22b40 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
22b50 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
22b60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
22b70 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46  ixShmPurge(unixF
22b80 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69  ile *pFd){.  uni
22b90 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46  xShmNode *p = pF
22ba0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
22bb0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
22bc0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
22bd0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
22be0 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d 30 29 20  AYS(p->nRef==0) 
22bf0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50  ){.    int nShmP
22c00 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
22c10 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
22c20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
22c30 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
22c40 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
22c50 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
22c60 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
22c70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22c80 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d  <p->nRegion; i+=
22c90 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20  nShmPerMap){.   
22ca0 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
22cb0 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
22cc0 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
22cd0 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
22ce0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22d00 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
22d10 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
22d20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
22d30 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
22d40 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
22d50 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
22d60 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
22d70 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
22d80 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
22d90 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
22da0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
22db0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22dc0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
22dd0 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64  ** Open a shared
22de0 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
22df0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65  ociated with ope
22e00 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
22e10 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73  pDbFd.  .** This
22e20 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c   particular impl
22e30 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
22e40 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a  mmapped files..*
22e50 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73  *.** The file us
22e60 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
22e70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73  shared-memory is
22e80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
22e90 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65  ectory.** as the
22ea0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
22eb0 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20  ile and has the 
22ec0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
22ed0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
22ee0 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  * file with the 
22ef0 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64  "-shm" suffix ad
22f00 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ded.  For exampl
22f10 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  e, if the databa
22f20 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f  se file.** is "/
22f30 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
22f40 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66  g.db" then the f
22f50 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61  ile that is crea
22f60 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a  ted and mmapped.
22f70 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  ** for shared me
22f80 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c  mory will be cal
22f90 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31  led "/home/user1
22fa0 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e  /config.db-shm".
22fb0 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72    .**.** Another
22fc0 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20   approach to is 
22fd0 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20  to use files in 
22fe0 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76  /dev/shm or /dev
22ff0 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f  /tmp or an.** so
23000 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d  me other tmpfs m
23010 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66  ount. But if a f
23020 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65  ile in a differe
23030 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  nt directory.** 
23040 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
23050 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20  e file is used, 
23060 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61  then differing a
23070 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
23080 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74  s.** or a chroot
23090 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  () might cause t
230a0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f  wo different pro
230b0 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61  cesses on the sa
230c0 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  me.** database t
230d0 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64  o end up using d
230e0 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66  ifferent files f
230f0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
23100 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74   - .** meaning t
23110 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  hat their memory
23120 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c   would not reall
23130 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65  y be shared - re
23140 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61  sulting.** in da
23150 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
23160 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  n.  Nevertheless
23170 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c  , this tmpfs fil
23180 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62  e usage.** can b
23190 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  e enabled at com
231a0 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20  pile-time using 
231b0 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  -DSQLITE_SHM_DIR
231c0 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d  ECTORY="/dev/shm
231d0 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69  ".** or the equi
231e0 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65  valent.  The use
231f0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53   of the SQLITE_S
23200 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
23210 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74  pile-time.** opt
23220 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ion results in a
23230 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62  n incompatible b
23240 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20  uild of SQLite; 
23250 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74   builds of SQLit
23260 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64  e.** that with d
23270 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f  iffering SQLITE_
23280 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65  SHM_DIRECTORY se
23290 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74  ttings attempt t
232a0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d  o use the.** sam
232b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
232c0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
232d0 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  , database corru
232e0 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c  ption will likel
232f0 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65  y.** result. The
23300 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
23310 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
23320 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e  me option is con
23330 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75  sidered.** "unsu
23340 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79  pported" and may
23350 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75   go away in a fu
23360 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65  ture SQLite rele
23370 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ase..**.** When 
23380 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
23390 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
233a0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
233b0 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
233c0 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
233d0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
233e0 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
233f0 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
23400 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
23410 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
23420 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
23430 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
23440 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
23450 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  .**.** If the or
23460 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
23470 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20  file (pDbFd) is 
23480 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d  using the "unix-
23490 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61  excl" VFS.** tha
234a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20  t means that an 
234b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
234c0 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
234d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a  tabase file and.
234e0 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ** that no other
234f0 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61   processes are a
23500 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ble to read or w
23510 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
23520 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63  e.  In.** that c
23530 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72  ase, we do not r
23540 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65  eally need share
23550 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68  d memory.  No sh
23560 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  ared memory.** f
23570 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ile is created. 
23580 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
23590 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c  ry will be simul
235a0 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d  ated with heap m
235b0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
235c0 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61   int unixOpenSha
235d0 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69  redMemory(unixFi
235e0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
235f0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20  ruct unixShm *p 
23600 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
23610 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
23620 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
23630 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
23640 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
23650 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
23660 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
23670 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23690 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
236a0 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  code */.  unixIn
236b0 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
236c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
236d0 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a   inode of fd */.
236e0 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65    char *zShmFile
236f0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
23700 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
23710 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53   file used for S
23720 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d  HM */.  int nShm
23730 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
23740 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23750 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e  of the SHM filen
23760 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
23770 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
23780 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
23790 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e   unixShm object.
237a0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
237b0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
237c0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
237d0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
237e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
237f0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
23800 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61  sizeof(*p));.  a
23810 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
23820 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  hm==0 );..  /* C
23830 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
23840 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
23850 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  ect already exis
23860 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69  ts. Reuse an exi
23870 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69  sting.  ** one i
23880 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74  f present. Creat
23890 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
238a0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
238b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
238c0 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44  );.  pInode = pD
238d0 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70  bFd->pInode;.  p
238e0 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ShmNode = pInode
238f0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66  ->pShmNode;.  if
23900 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
23910 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
23920 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
23930 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74          /* fstat
23940 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61  () info for data
23950 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66  base file */.#if
23960 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ndef SQLITE_SHM_
23970 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f  DIRECTORY.    co
23980 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50  nst char *zBaseP
23990 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61  ath = pDbFd->zPa
239a0 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  th;.#endif..    
239b0 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20  /* Call fstat() 
239c0 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  to figure out th
239d0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
239e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
239f0 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  le. If.    ** a 
23a00 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69  new *-shm file i
23a10 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74  s created, an at
23a20 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61  tempt will be ma
23a30 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a  de to create it.
23a40 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
23a50 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
23a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23a70 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e   osFstat(pDbFd->
23a80 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
23a90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23aa0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
23ab0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
23ac0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
23ad0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
23ae0 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
23af0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
23b00 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
23b10 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
23b20 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
23b30 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
23b40 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
23b50 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
23b60 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
23b70 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
23b80 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
23b90 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
23ba0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
23bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
23bc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
23bd0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
23be0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
23bf0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
23c00 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
23c10 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53  of(*pShmNode)+nS
23c20 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
23c30 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
23c40 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
23c50 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
23c60 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
23c70 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
23c80 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
23c90 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
23ca0 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
23cb0 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
23cd0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23ce0 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
23cf0 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
23d10 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
23d20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
23d30 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
23d40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
23d50 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
23d60 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
23d70 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b  hm", zBasePath);
23d80 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
23d90 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
23da0 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  Path, zShmFilena
23db0 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  me);.#endif.    
23dc0 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31  pShmNode->h = -1
23dd0 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e  ;.    pDbFd->pIn
23de0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
23df0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53  pShmNode;.    pS
23e00 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d  hmNode->pInode =
23e10 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
23e20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
23e30 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
23e40 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
23e50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
23e60 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
23e70 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
23e80 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
23e90 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  if( pShmNode->mu
23ea0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
23eb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23ec0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
23ed0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
23ee0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
23ef0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
23f00 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
23f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23f20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
23f30 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
23f40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23f50 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62  _uri_boolean(pDb
23f60 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64  Fd->zPath, "read
23f70 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b  only_shm", 0) ){
23f80 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
23f90 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
23fa0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
23fb0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
23fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23fd0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
23fe0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
23ff0 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
24000 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
24010 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
24020 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
24030 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24040 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24050 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
24060 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
24070 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
24080 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
24090 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
240a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
240b0 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
240c0 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65  ng as root, make
240d0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53   sure that the S
240e0 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  HM file.      **
240f0 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65   is owned by the
24100 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20   same user that 
24110 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61  owns the origina
24120 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68  l database.  Oth
24130 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
24140 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77   the original ow
24150 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ner will not be 
24160 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e  able to connect.
24170 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24180 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68  robustFchown(pSh
24190 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e  mNode->h, sStat.
241a0 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74  st_uid, sStat.st
241b0 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20  _gid);.  .      
241c0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
241d0 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
241e0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
241f0 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
24200 68 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  h..      ** For 
24210 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 20 63  a readonly_shm c
24220 6c 69 65 6e 74 2c 20 69 66 20 6e 6f 20 6f 74 68  lient, if no oth
24230 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
24240 20 74 68 65 20 44 4d 53 20 6c 6f 63 6b 2c 0a 20   the DMS lock,. 
24250 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65       ** the file
24260 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
24270 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 43 41 4e  d and SQLITE_CAN
24280 54 4f 50 45 4e 5f 44 49 52 54 59 57 41 4c 20 69  TOPEN_DIRTYWAL i
24290 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  s returned..    
242a0 20 20 2a 2a 20 4f 72 2c 20 66 6f 72 20 61 20 72    ** Or, for a r
242b0 65 61 64 2d 77 72 69 74 65 20 63 6f 6e 6e 65 63  ead-write connec
242c0 74 69 6f 6e 2c 20 69 66 20 6e 6f 20 6f 74 68 65  tion, if no othe
242d0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
242e0 61 0a 20 20 20 20 20 20 2a 2a 20 44 4d 53 20 6c  a.      ** DMS l
242f0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 69 73 20  ock the file is 
24300 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
24310 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
24320 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
24330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
24340 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
24350 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
24360 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63       struct floc
24370 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  k lock;.        
24380 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
24390 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
243a0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
243b0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20   UNIX_SHM_DMS;. 
243c0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
243d0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c  n = 1;.        l
243e0 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
243f0 52 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  RLCK;.        if
24400 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  ( osFcntl(pShmNo
24410 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  de->h, F_GETLK, 
24420 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20  &lock)!=0 ) {.  
24430 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24440 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
24450 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
24460 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
24470 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
24480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24490 43 41 4e 54 4f 50 45 4e 5f 44 49 52 54 59 57 41  CANTOPEN_DIRTYWA
244a0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  L;.        }.   
244b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 6e 69     }else if( uni
244c0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
244d0 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  DbFd, F_WRLCK, U
244e0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
244f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24500 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
24510 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
24520 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
24530 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
24540 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
24550 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
24560 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
24570 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
24580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
245a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
245b0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
245c0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
245d0 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
245e0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
245f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
24600 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
24610 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rr;.    }.  }.. 
24620 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
24630 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
24640 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53  ild of the unixS
24650 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
24660 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
24670 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  de;.#ifdef SQLIT
24680 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
24690 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74  = pShmNode->next
246a0 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ShmId++;.#endif.
246b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
246c0 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  ++;.  pDbFd->pSh
246d0 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61  m = p;.  unixLea
246e0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
246f0 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
24700 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
24710 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24720 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
24730 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
24740 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e  er of the unixEn
24750 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
24760 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
24770 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
24780 65 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53  ew (struct unixS
24790 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
247a0 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
247b0 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
247c0 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
247d0 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
247e0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
247f0 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
24800 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
24810 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
24820 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
24830 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
24840 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
24850 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
24860 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
24870 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
24880 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
24890 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
248a0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
248b0 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
248c0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
248d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
248e0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
248f0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
24900 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
24910 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
24920 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
24930 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50  _err:.  unixShmP
24940 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20  urge(pDbFd);    
24950 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
24960 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
24970 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
24980 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
24990 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
249a0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
249b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
249c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
249d0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
249e0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
249f0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
24a00 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
24a10 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
24a20 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
24a30 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
24a40 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
24a50 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
24a60 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
24a70 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
24a80 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
24a90 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
24aa0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
24ab0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
24ac0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
24ad0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
24ae0 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
24af0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
24b00 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
24b10 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65  bExtend paramete
24b20 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
24b30 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
24b40 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
24b50 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
24b60 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
24b70 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
24b80 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
24b90 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
24ba0 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
24bb0 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
24bc0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24bd0 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
24be0 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a  bExtend is non-z
24bf0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
24c00 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
24c10 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
24c20 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
24c30 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
24c40 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
24c50 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
24c60 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
24c70 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
24c80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
24c90 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
24ca0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
24cb0 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
24cc0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
24cd0 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
24ce0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
24cf0 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
24d00 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
24d10 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
24d20 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
24d30 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
24d40 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
24d50 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24d60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24d70 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73   unixShmMap(.  s
24d80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24da0 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
24db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24dc0 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
24df0 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
24e00 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e20 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
24e30 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65  s */.  int bExte
24e40 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
24e50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
24e60 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
24e70 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
24e80 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
24e90 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
24ea0 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
24eb0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e  emory */.){.  un
24ec0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  ixFile *pDbFd = 
24ed0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
24ee0 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75   unixShm *p;.  u
24ef0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
24f00 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
24f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
24f20 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75  t nShmPerMap = u
24f30 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d  nixShmRegionPerM
24f40 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71  ap();.  int nReq
24f50 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66  Region;..  /* If
24f60 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
24f70 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
24f80 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
24f90 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
24fa0 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
24fb0 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
24fc0 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
24fd0 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
24fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24ff0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
25000 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
25010 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
25020 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
25030 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
25040 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
25050 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
25060 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
25070 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
25080 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
25090 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
250a0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
250b0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
250c0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
250d0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
250e0 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
250f0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
25100 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
25110 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
25120 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
25130 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
25140 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69  =0 );..  /* Mini
25150 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
25160 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74  gions required t
25170 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a  o be mapped. */.
25180 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28    nReqRegion = (
25190 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72  (iRegion+nShmPer
251a0 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61  Map) / nShmPerMa
251b0 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b  p) * nShmPerMap;
251c0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
251d0 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
251e0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
251f0 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25210 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
25220 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
25230 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65  t nByte = nReqRe
25240 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  gion*szRegion;  
25250 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
25260 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
25270 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
25280 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
25290 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
252a0 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
252b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
252c0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
252d0 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
252e0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
252f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
25300 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
25310 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
25320 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
25330 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
25340 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
25350 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
25360 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
25370 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
25380 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
25390 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
253a0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
253b0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
253c0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
253d0 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
253e0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
253f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
25400 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
25410 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
25420 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
25430 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
25440 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
25450 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
25460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
25470 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
25480 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
25490 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
254a0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
254b0 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
254c0 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
254d0 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
254e0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
254f0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
25500 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
25510 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
25520 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
25530 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
25540 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
25550 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
25560 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
25570 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
25580 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
25590 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
255a0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
255b0 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
255c0 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
255d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
255e0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
255f0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
25600 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
25610 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
25620 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
25630 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
25640 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
25650 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
25660 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
25670 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
25680 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
25690 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
256a0 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
256b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
256c0 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
256d0 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
256e0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
256f0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
25700 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
25710 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
25720 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
25730 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
25740 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
25750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
25760 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
25770 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
25780 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
25790 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
257a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
257b0 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
257c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
257d0 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
257e0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
257f0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
25800 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
25810 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a       int x = 0;.
25820 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25830 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
25840 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a  ShmNode->h, iPg*
25850 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22  pgsz + pgsz-1, "
25860 22 2c 20 31 2c 20 26 78 29 21 3d 31 20 29 7b 0a  ", 1, &x)!=1 ){.
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
25880 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
25890 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
258a0 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
258b0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
258c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
258d0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
258e0 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
258f0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25900 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
25910 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25930 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
25940 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
25950 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
25960 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
25970 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
25980 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
25990 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
259a0 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
259b0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
259c0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
259d0 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
259e0 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
259f0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
25a00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
25a10 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
25a20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
25a30 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25a40 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
25a50 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
25a60 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  New;.    while( 
25a70 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
25a80 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
25a90 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d        int nMap =
25aa0 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65   szRegion*nShmPe
25ab0 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rMap;.      int 
25ac0 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  i;.      void *p
25ad0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
25ae0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
25af0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
25b00 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a  osMmap(0, nMap,.
25b10 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
25b20 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
25b30 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
25b40 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
25b50 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
25b60 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
25b70 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67  hmNode->h, szReg
25b80 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64  ion*(i64)pShmNod
25b90 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20  e->nRegion.     
25ba0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
25bb0 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
25bc0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
25bd0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
25be0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
25bf0 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
25c00 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
25c10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
25c20 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
25c30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25c50 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
25c60 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e  alloc64(szRegion
25c70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25c80 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
25c90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25ca0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25cb0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
25cc0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
25cd0 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
25ce0 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
25cf0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  on);.      }..  
25d00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
25d10 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b  ShmPerMap; i++){
25d20 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
25d30 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
25d40 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d  Node->nRegion+i]
25d50 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d   = &((char*)pMem
25d60 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20  )[szRegion*i];. 
25d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
25d80 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b  mNode->nRegion +
25d90 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  = nShmPerMap;.  
25da0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
25db0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
25dc0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
25dd0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
25de0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
25df0 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
25e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
25e10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
25e20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
25e30 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
25e40 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
25e50 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
25e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
25e70 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
25e80 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
25e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
25ea0 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
25eb0 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
25ec0 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
25ed0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
25ee0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
25ef0 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
25f00 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
25f10 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
25f20 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
25f30 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
25f40 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
25f50 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
25f60 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
25f70 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
25f80 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
25f90 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
25fa0 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
25fb0 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
25fc0 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
25fd0 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
25fe0 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
25ff0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
26000 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
26010 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
26020 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
26030 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
26040 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
26050 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
26060 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
26070 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
26080 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
26090 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
260a0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
260b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
260c0 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
260d0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
260e0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
260f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
26100 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
26110 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
26120 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
26130 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
26140 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
26150 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
26160 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
26170 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
26180 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
261a0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
261b0 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
261c0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
261f0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
26200 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
26210 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
26220 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
26230 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
26240 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
26250 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
26260 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26280 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
26290 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
262c0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
262d0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
262e0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
262f0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
26300 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
26310 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
26320 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
26330 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
26340 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
26350 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
26360 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
26370 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
26380 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
26390 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
263a0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
263b0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
263c0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
263d0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
263e0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
263f0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
26400 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
26410 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
26420 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
26430 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
26440 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
26450 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
26460 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
26470 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
26480 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
26490 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
264a0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
264b0 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
264c0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
264d0 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
264e0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
264f0 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
26500 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
26510 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
26520 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
26530 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
26540 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
26550 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
26560 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
26570 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
26580 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
26590 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
265a0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
265b0 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
265c0 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
265d0 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
265e0 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
265f0 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
26600 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
26610 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
26620 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
26630 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
26640 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
26650 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
26660 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
26670 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
26680 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
26690 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
266a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
266b0 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
266c0 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
266d0 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
266e0 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
266f0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
26700 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
26710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
26720 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
26730 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c  ock(pDbFd, F_UNL
26740 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
26750 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
26760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26780 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
26790 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
267a0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
267b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
267c0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
267d0 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
267e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
267f0 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
26800 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
26810 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
26820 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
26830 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
26840 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
26850 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
26860 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
26870 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
26880 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
26890 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
268a0 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
268b0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
268c0 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
268d0 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
268e0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
268f0 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
26900 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
26910 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
26920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
26930 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
26940 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
26950 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
26960 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
26970 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
26980 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26990 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
269a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
269b0 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
269c0 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
269d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
269e0 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
269f0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
26a00 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
26a10 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
26a20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26a30 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
26a40 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
26a50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26a60 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
26a70 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b  k(pDbFd, F_RDLCK
26a80 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
26a90 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
26aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
26ab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26ad0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
26ae0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
26af0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
26b00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26b10 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
26b20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
26b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
26b40 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
26b50 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
26b60 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
26b70 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
26b80 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
26b90 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
26ba0 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
26bb0 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
26bc0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
26bd0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
26be0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
26bf0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
26c00 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
26c10 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
26c20 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
26c30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26c40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
26c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
26c70 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
26c80 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
26c90 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
26ca0 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
26cb0 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
26cc0 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
26cd0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
26ce0 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
26cf0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
26d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26d10 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
26d20 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
26d30 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_WRLCK, ofst+UN
26d40 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
26d50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26d60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26d70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
26d80 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
26d90 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
26da0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
26db0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
26dc0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
26dd0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
26de0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26df0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
26e00 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
26e10 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
26e20 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
26e30 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70     p->id, osGetp
26e40 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64  id(0), p->shared
26e50 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
26e60 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  k));.  return rc
26e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
26e80 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
26e90 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
26ea0 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
26eb0 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
26ec0 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
26ed0 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
26ee0 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
26ef0 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
26f00 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
26f10 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
26f20 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
26f30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26f40 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a  unixShmBarrier(.
26f50 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26f60 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fd              
26f70 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
26f80 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
26f90 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
26fa0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
26fb0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c  METER(fd);.  sql
26fc0 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65  ite3MemoryBarrie
26fd0 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  r();         /* 
26fe0 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
26ff0 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
27000 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
27010 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 20 20  tex();          
27020 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74       /* Also mut
27030 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e  ex, for redundan
27040 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76  cy */.  unixLeav
27050 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
27060 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
27070 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
27080 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
27090 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a  the underlying .
270a0 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
270b0 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
270c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
270d0 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65   is no shared me
270e0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
270f0 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  with the connect
27100 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ion then this.**
27110 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61   routine is a ha
27120 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f  rmless no-op..*/
27130 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27140 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
27150 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
27160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27170 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
27180 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
27190 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271b0 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
271c0 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
271d0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
271e0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
271f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27200 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
27210 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69   closed */.  uni
27220 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
27230 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
27240 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
27250 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
27260 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
27270 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pp;            
27280 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
27290 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
272a0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
272b0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  /.  unixFile *pD
272c0 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
272d0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
272e0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
272f0 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20  ile */..  pDbFd 
27300 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
27310 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
27320 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
27330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27340 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
27350 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
27360 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
27370 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
27380 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
27390 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
273a0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
273b0 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20  pInode );..  /* 
273c0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
273d0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
273e0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
273f0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
27400 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
27410 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
27420 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
27430 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
27440 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
27450 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
27460 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
27470 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
27480 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
27490 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
274a0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
274b0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
274c0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
274d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
274e0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
274f0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
27500 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
27510 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
27520 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
27530 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
27540 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
27550 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  o */.  unixEnter
27560 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
27570 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
27580 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
27590 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
275a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
275b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65  =0 ){.    if( de
275c0 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d  leteFlag && pShm
275d0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
275e0 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68      osUnlink(pSh
275f0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
27600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  );.    }.    uni
27610 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
27620 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
27630 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
27640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27650 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ...#else.# defin
27660 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20  e unixShmMap    
27670 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
27680 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
27690 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72  efine unixShmBar
276a0 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
276b0 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30  unixShmUnmap   0
276c0 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
276d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
276e0 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54  AL */..#if SQLIT
276f0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27700 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  0./*.** If it is
27710 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72   currently memor
27720 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20  y mapped, unmap 
27730 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61  file pFd..*/.sta
27740 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d  tic void unixUnm
27750 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
27760 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28  *pFd){.  assert(
27770 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
27780 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  =0 );.  if( pFd-
27790 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
277a0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d     osMunmap(pFd-
277b0 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64  >pMapRegion, pFd
277c0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
277d0 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70  );.    pFd->pMap
277e0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
277f0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
27800 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
27810 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
27820 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
27830 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
27840 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  size of the memo
27850 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74  ry mapping maint
27860 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a  ained by file .*
27870 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  * descriptor pFd
27880 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20   to nNew bytes. 
27890 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  Any existing map
278a0 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64 65  ping is discarde
278b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
278c0 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
278d0 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66  ction sets the f
278e0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
278f0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
27900 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67  unixFile.pMapReg
27910 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ion.**       uni
27920 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a  xFile.mmapSize.*
27930 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
27940 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a  .mmapSizeActual.
27950 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65  **.** If unsucce
27960 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20  ssful, an error 
27970 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65  message is logge
27980 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f  d via sqlite3_lo
27990 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74  g() and.** the t
279a0 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61  hree variables a
279b0 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  bove are zeroed.
279c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51   In this case SQ
279d0 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63  Lite should.** c
279e0 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e  ontinue accessin
279f0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  g the database u
27a00 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29  sing the xRead()
27a10 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a   and xWrite().**
27a20 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
27a30 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d  tic void unixRem
27a40 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69  apfile(.  unixFi
27a50 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20  le *pFd,        
27a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
27a70 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a  e descriptor obj
27a80 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65  ect */.  i64 nNe
27a90 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
27aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
27ab0 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a  ired mapping siz
27ac0 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
27ad0 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d  char *zErr = "mm
27ae0 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70  ap";.  int h = p
27af0 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20  Fd->h;          
27b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27b10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
27b20 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a  pen on db file *
27b30 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20  /.  u8 *pOrig = 
27b40 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
27b50 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e  egion;   /* Poin
27b60 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66  ter to current f
27b70 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ile mapping */. 
27b80 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64   i64 nOrig = pFd
27b90 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
27ba0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
27bb0 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e   pOrig region in
27bc0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a   bytes */.  u8 *
27bd0 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  pNew = 0;       
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20   /* Location of 
27c00 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  new mapping */. 
27c10 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f   int flags = PRO
27c20 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20  T_READ;         
27c30 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
27c40 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29  o pass to mmap()
27c50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
27c60 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
27c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
27c80 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ew>pFd->mmapSize
27c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
27ca0 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ew<=pFd->mmapSiz
27cb0 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74  eMax );.  assert
27cc0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73  ( nNew>0 );.  as
27cd0 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53  sert( pFd->mmapS
27ce0 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e  izeActual>=pFd->
27cf0 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
27d00 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44  sert( MAP_FAILED
27d10 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  !=0 );..#ifdef S
27d20 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
27d30 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d  RITE.  if( (pFd-
27d40 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
27d50 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30  XFILE_RDONLY)==0
27d60 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54   ) flags |= PROT
27d70 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a  _WRITE;.#endif..
27d80 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23    if( pOrig ){.#
27d90 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
27da0 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
27db0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23  pFd->mmapSize;.#
27dc0 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
27dd0 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f  nt szSyspage = o
27de0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a  sGetpagesize();.
27df0 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
27e00 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20   (pFd->mmapSize 
27e10 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29  & ~(szSyspage-1)
27e20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38  );.#endif.    u8
27e30 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b   *pReq = &pOrig[
27e40 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a  nReuse];..    /*
27e50 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73   Unmap any pages
27e60 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
27e70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61   mapping that ca
27e80 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20  nnot be reused. 
27e90 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73  */.    if( nReus
27ea0 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  e!=nOrig ){.    
27eb0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c    osMunmap(pReq,
27ec0 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a   nOrig-nReuse);.
27ed0 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f      }..#if HAVE_
27ee0 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20  MREMAP.    pNew 
27ef0 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67  = osMremap(pOrig
27f00 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20  , nReuse, nNew, 
27f10 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b  MREMAP_MAYMOVE);
27f20 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65  .    zErr = "mre
27f30 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20  map";.#else.    
27f40 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52  pNew = osMmap(pR
27f50 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c  eq, nNew-nReuse,
27f60 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52   flags, MAP_SHAR
27f70 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a  ED, h, nReuse);.
27f80 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41      if( pNew!=MA
27f90 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
27fa0 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71    if( pNew!=pReq
27fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
27fc0 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20  nmap(pNew, nNew 
27fd0 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20  - nReuse);.     
27fe0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
27ff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28000 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a    pNew = pOrig;.
28010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
28020 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
28030 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65   attempt to exte
28040 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  nd the existing 
28050 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20  mapping failed. 
28060 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  Free it. */.    
28070 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
28080 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20  ILED || pNew==0 
28090 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
280a0 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29  p(pOrig, nReuse)
280b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
280c0 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69  * If pNew is sti
280d0 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20  ll NULL, try to 
280e0 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65  create an entire
280f0 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20  ly new mapping. 
28100 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
28110 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f   ){.    pNew = o
28120 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66  sMmap(0, nNew, f
28130 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
28140 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , h, 0);.  }..  
28150 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41  if( pNew==MAP_FA
28160 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77  ILED ){.    pNew
28170 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d   = 0;.    nNew =
28180 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   0;.    unixLogE
28190 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20  rror(SQLITE_OK, 
281a0 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68  zErr, pFd->zPath
281b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
281c0 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66  e mmap() above f
281d0 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ailed, assume th
281e0 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
281f0 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20  t mmap() calls. 
28200 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61     ** will proba
28210 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61  bly fail too. Fa
28220 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  ll back to using
28230 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78   xRead/xWrite ex
28240 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a  clusively.    **
28250 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
28260 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  */.    pFd->mmap
28270 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d  SizeMax = 0;.  }
28280 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  .  pFd->pMapRegi
28290 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65  on = (void *)pNe
282a0 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  w;.  pFd->mmapSi
282b0 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ze = pFd->mmapSi
282c0 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b  zeActual = nNew;
282d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  .}../*.** Memory
282e0 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68   map or remap th
282f0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
28300 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
28310 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c   pFd (if the fil
28320 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20  e.** is already 
28330 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73  mapped, the exis
28340 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
28350 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
28360 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a  new). Or, if .**
28370 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
28380 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
28390 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
283a0 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
283b0 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ll .** outstandi
283c0 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
283d0 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
283e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
283f0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
28400 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
28410 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
28420 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
28430 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
28440 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69  of .** the mappi
28450 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74  ng to create. Ot
28460 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74  herwise, if nByt
28470 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
28480 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ero, then the .*
28490 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
284a0 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
284b0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
284c0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
284d0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
284e0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
284f0 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
28500 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
28510 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
28520 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54   .** using SQLIT
28530 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
28540 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  IT, whichever is
28550 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
28560 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
28570 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
28580 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
28590 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
285a0 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
285b0 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
285c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
285d0 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
285e0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
285f0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
28600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28610 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
28620 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61 70  e *pFd, i64 nMap
28630 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ){.  assert( nMa
28640 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
28650 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
28660 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c  ssert( nMap>0 ||
28670 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d   (pFd->mmapSize=
28680 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52  =0 && pFd->pMapR
28690 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  egion==0) );.  i
286a0 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
286b0 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
286c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
286d0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72  Map<0 ){.    str
286e0 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
286f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
28700 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
28710 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
28720 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 64 2d  if( osFstat(pFd-
28730 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20 29 7b  >h, &statbuf) ){
28740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28750 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
28760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
28770 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
28780 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
28790 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
287a0 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
287b0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
287c0 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ax;.  }..  asser
287d0 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46  t( nMap>0 || (pF
287e0 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26  d->mmapSize==0 &
287f0 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  & pFd->pMapRegio
28800 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 6e  n==0) );.  if( n
28810 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
28820 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 52 65  ze ){.    unixRe
28830 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
28840 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  p);.  }..  retur
28850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
28860 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
28870 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
28880 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
28890 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
288a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
288b0 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
288c0 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
288d0 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
288e0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
288f0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
28900 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
28910 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
28920 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
28930 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
28940 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
28950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
28960 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
28970 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
28980 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
28990 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
289a0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
289b0 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
289c0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
289d0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
289e0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
289f0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
28a00 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
28a10 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
28a20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
28a30 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
28a40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
28a50 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
28a60 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
28a70 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
28a80 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
28a90 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
28aa0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
28ab0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
28ac0 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
28ad0 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
28ae0 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
28af0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
28b00 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
28b10 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
28b20 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
28b30 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
28b40 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
28b50 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
28b60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
28b70 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
28b80 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
28b90 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
28ba0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
28bb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
28bc0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
28bd0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
28be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28c00 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
28c10 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
28c20 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
28c30 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
28c40 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
28c50 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
28c60 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
28c70 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
28c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
28ca0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
28cb0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
28cc0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
28cd0 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
28ce0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
28cf0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
28d00 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
28d10 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
28d20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
28d30 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
28d40 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
28d50 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
28d60 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
28d70 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
28d80 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
28d90 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
28da0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
28db0 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
28dc0 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
28dd0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28de0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
28df0 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
28e00 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
28e10 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
28e20 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
28e30 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
28e40 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
28e50 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
28e60 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
28e70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
28e80 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
28e90 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
28ea0 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
28eb0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
28ec0 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
28ed0 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
28ee0 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
28ef0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
28f00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
28f10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28f20 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
28f30 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
28f40 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
28f50 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
28f60 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
28f70 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
28f80 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
28f90 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
28fa0 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
28fb0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
28fc0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
28fd0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
28fe0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
28ff0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
29000 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
29010 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
29020 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
29030 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
29040 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
29050 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
29060 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
29070 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
29080 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
29090 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
290a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
290b0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
290c0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
290d0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
290e0 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
290f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29100 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
29110 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
29120 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
29130 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
29140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
29160 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
29170 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
29180 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
29190 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
291a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
291b0 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
291c0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
291d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
291e0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
291f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29230 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
29240 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
29250 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
29260 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
29270 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
29280 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
29290 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
292a0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
292b0 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
292c0 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
292d0 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
292e0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
292f0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
29300 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
29310 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
29320 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29330 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
29340 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
29350 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
29360 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
29370 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
29380 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
29390 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
293a0 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
293b0 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
293c0 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
293d0 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
293e0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
293f0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
29400 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
29410 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
29420 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
29430 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
29440 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
29450 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
29460 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
29470 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
29480 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
29490 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
294a0 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
294b0 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
294c0 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
294d0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
294e0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20  der-function F, 
294f0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
29500 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
29510 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
29520 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
29530 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
29540 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
29550 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
29560 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
29570 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
29580 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
29590 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
295a0 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
295b0 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
295c0 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
295d0 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
295e0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
295f0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
29600 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
29610 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
29620 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
29630 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
29640 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
29650 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
29660 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
29670 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
29680 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
29690 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
296a0 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
296b0 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
296c0 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
296d0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
296e0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
296f0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
29700 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
29710 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
29720 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
29730 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
29740 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
29750 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
29760 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
29770 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
29780 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
29790 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
297a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
297b0 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
297c0 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
297d0 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c  ,METHOD,VERSION,
297e0 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43  CLOSE,LOCK,UNLOC
297f0 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29  K,CKLOCK,SHMMAP)
29800 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
29810 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
29820 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
29830 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
29860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29870 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
29880 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29910 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29940 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
29950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29960 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
299a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
299b0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
299e0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29a30 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a50 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29a80 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29aa0 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29ad0 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29af0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29b20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
29b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29b40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29b50 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
29b60 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29b70 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
29b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
29b90 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
29bc0 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
29bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
29be0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29c10 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
29c20 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
29c30 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
29c40 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
29c50 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d         \.   SHMM
29c60 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AP,             
29c70 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29c80 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
29cb0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
29cc0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
29cd0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
29d00 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
29d10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
29d20 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
29d50 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
29d60 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
29d70 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63     \.   unixFetc
29da0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
29db0 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29de0 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74    \.   unixUnfet
29df0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
29e00 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
29e10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
29e90 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29ea0 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
29eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
29ec0 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
29ed0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29ee0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
29ef0 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29f20 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
29f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
29fc0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
29fd0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
29fe0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
29ff0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2a000 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
2a010 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
2a020 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
2a030 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
2a040 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a050 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
2a060 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
2a070 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
2a080 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
2a090 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
2a0a0 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
2a0b0 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
2a0c0 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
2a0d0 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
2a0e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2a0f0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2a100 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
2a110 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2a120 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2a130 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a140 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a160 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2a170 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
2a180 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
2a190 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
2a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a1b0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2a1c0 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2a1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2a1e0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a1f0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
2a200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a210 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2a220 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2a230 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
2a240 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a250 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2a260 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20  xShmMap         
2a270 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2a280 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
2a290 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
2a2a0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
2a2b0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2a2c0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2a2d0 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
2a2e0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
2a2f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a300 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2a310 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a330 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2a340 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
2a350 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
2a360 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2a370 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
2a380 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
2a390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2a3a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
2a3b0 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
2a3c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2a3d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
2a3e0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
2a3f0 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65  edLock,  /* xChe
2a400 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2a410 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2a440 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
2a450 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
2a460 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a470 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2a480 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2a490 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2a4a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
2a4b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a4c0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2a4d0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2a4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2a4f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2a500 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
2a510 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2a520 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2a530 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
2a540 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2a550 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a560 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
2a570 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2a580 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2a590 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
2a5a0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2a5b0 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b  dLock, /* xCheck
2a5c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2a5d0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2a600 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
2a610 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a620 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
2a630 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
2a640 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2a650 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2a660 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
2a670 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
2a680 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2a690 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2a6a0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2a6b0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2a6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2a6d0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2a6e0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
2a6f0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
2a700 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2a710 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
2a720 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
2a730 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2a740 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
2a750 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2a760 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2a770 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
2a780 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
2a790 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
2a7a0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2a7b0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2a7e0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2a7f0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2a800 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
2a810 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2a820 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2a830 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2a840 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
2a850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2a860 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a870 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a880 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8a0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2a8b0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2a8c0 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20   semXClose,     
2a8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2a8e0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2a8f0 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20   semXLock,      
2a900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2a910 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a920 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  semXUnlock,     
2a930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a940 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2a950 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
2a960 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
2a970 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2a980 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2a9b0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
2a9c0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
2a9d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2a9e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2a9f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
2aa00 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
2aa10 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2aa20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2aa30 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2aa40 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
2aa50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2aa60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2aa70 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2aa80 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2aa90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2aaa0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2aab0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
2aac0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2aad0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2aae0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
2aaf0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2ab00 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2ab10 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
2ab20 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2ab30 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2ab40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
2ab50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ab60 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
2ab70 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2ab80 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2abb0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2abc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
2abd0 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
2abe0 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
2abf0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
2ac00 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
2ac10 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
2ac20 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
2ac30 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
2ac40 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
2ac50 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
2ac60 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
2ac70 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
2ac80 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
2ac90 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
2aca0 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
2acb0 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2acc0 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2acd0 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
2ace0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
2acf0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
2ad00 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
2ad10 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
2ad20 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
2ad30 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
2ad40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2ad50 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
2ad60 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
2ad70 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
2ad80 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
2ad90 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
2ada0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
2adb0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2adc0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2add0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2ade0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2adf0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
2ae00 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
2ae10 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
2ae20 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
2ae30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2ae40 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
2ae50 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2ae60 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
2ae70 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
2ae80 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2ae90 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
2aea0 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2aec0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2aed0 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
2aee0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2aef0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2af00 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2af10 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af30 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2af40 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2af50 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
2af60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2af70 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2af80 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2afb0 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
2afc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2afd0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2afe0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
2aff0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2b000 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2b010 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2b020 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2b030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b040 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2b050 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
2b060 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
2b070 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
2b080 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
2b090 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
2b0a0 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
2b0b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b0c0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b0d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b0e0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
2b0f0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2b100 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b110 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b120 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
2b130 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2b140 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2b150 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2b160 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b180 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2b190 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2b1a0 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b1c0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2b1d0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2b200 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2b230 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
2b240 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2b250 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2b260 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2b270 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b290 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2b2a0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
2b2b0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2b2c0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2b2d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b2e0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
2b2f0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2b300 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
2b310 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
2b320 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
2b330 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
2b340 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
2b350 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
2b360 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
2b370 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
2b380 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
2b390 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
2b3a0 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
2b3b0 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
2b3c0 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
2b3d0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2b3e0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
2b3f0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2b400 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2b410 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
2b420 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2b430 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
2b440 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
2b450 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
2b460 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
2b470 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b480 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
2b490 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
2b4a0 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
2b4b0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
2b4c0 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
2b4d0 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
2b4e0 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
2b4f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b500 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
2b510 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
2b520 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
2b530 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
2b540 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
2b550 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
2b560 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2b570 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
2b580 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2b590 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
2b5a0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2b5b0 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
2b5c0 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2b5d0 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
2b5e0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
2b5f0 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
2b600 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
2b610 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2b620 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
2b630 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2b640 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2b650 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2b660 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2b670 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2b680 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2b690 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2b6a0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2b6b0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2b6c0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2b6d0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2b6e0 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
2b6f0 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
2b700 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
2b710 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
2b720 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
2b730 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
2b740 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2b750 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
2b760 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
2b770 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
2b780 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
2b790 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
2b7a0 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
2b7b0 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
2b7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
2b7d0 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
2b7e0 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
2b7f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2b800 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
2b810 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
2b820 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
2b830 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
2b840 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
2b850 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
2b860 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
2b870 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
2b880 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2b890 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
2b8a0 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
2b8b0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2b8c0 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2b8d0 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2b8e0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2b8f0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2b900 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2b910 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2b920 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2b930 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2b940 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2b950 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2b960 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2b970 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "nfs")==0 ){. 
2b980 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73       return &nfs
2b990 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2b9a0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
2b9b0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2b9c0 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  hods;.    }.  }e
2b9d0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2b9e0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2b9f0 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2ba00 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2ba10 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2ba20 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
2ba30 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2ba40 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2ba50 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2ba60 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
2ba70 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2ba80 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2ba90 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2baa0 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
2bab0 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  WORKS./*.** This
2bac0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
2bad0 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63  on for VxWorks c
2bae0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2baf0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a  posix advisory.*
2bb00 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e  * locking works.
2bb10 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68    If it does, th
2bb20 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74 20  en that is what 
2bb30 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74 20  is used.  If it 
2bb40 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b  does not.** work
2bb50 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20  , then fallback 
2bb60 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  to named semapho
2bb70 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  re locking..*/.s
2bb80 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2bb90 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2bba0 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2bbb0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2bbc0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2bbd0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2bbe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2bbf0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2bc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
2bc10 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
2bc20 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
2bc30 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2bc40 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2bc50 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2bc60 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2bc70 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2bc80 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2bc90 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2bca0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2bcb0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2bcc0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2bcd0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2bce0 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
2bcf0 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
2bd00 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
2bd10 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
2bd20 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
2bd30 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
2bd40 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
2bd50 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
2bd60 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2bd70 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2bd80 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2bd90 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2bda0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2bdb0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2bdc0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2bdd0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2bde0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2bdf0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2be00 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
2be10 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2be20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2be30 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
2be40 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2be50 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2be60 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2be70 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69  onst vxworksIoFi
2be80 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2be90 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76  *,unixFile*) = v
2bea0 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d  xworksIoFinderIm
2beb0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
2bec0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a  S_VXWORKS */../*
2bed0 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20  .** An abstract 
2bee0 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74  type for a point
2bef0 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68  er to an IO meth
2bf00 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
2bf10 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
2bf20 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2bf30 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
2bf40 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
2bf50 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
2bf60 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2bf70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bf80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bf90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2bfb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bfc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
2bfd0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2bfe0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2bff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2c000 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
2c010 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
2c020 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2c030 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
2c040 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
2c050 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
2c060 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2c070 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2c080 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2c090 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
2c0a0 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
2c0b0 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
2c0c0 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
2c0d0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
2c0e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2c0f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2c100 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2c110 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
2c120 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
2c130 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2c140 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2c150 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
2c160 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
2c170 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2c180 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2c190 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2c1a0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
2c1b0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2c1c0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ned */.  int ctr
2c1d0 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
2c1e0 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
2c1f0 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75   UNIXFILE_* valu
2c200 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
2c210 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c220 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
2c230 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
2c240 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2c250 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
2c260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2c270 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2c280 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
2c290 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20    /* No locking 
2c2a0 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72  occurs in tempor
2c2b0 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61  ary files */.  a
2c2c0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2c2d0 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67  !=0 || (ctrlFlag
2c2e0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
2c2f0 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53  OCK)!=0 );..  OS
2c300 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
2c310 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
2c320 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
2c330 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
2c340 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  w->pVfs = pVfs;.
2c350 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20    pNew->zPath = 
2c360 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65  zFilename;.  pNe
2c370 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  w->ctrlFlags = (
2c380 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69  u8)ctrlFlags;.#i
2c390 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
2c3a0 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d  P_SIZE>0.  pNew-
2c3b0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
2c3c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c3d0 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.szMmap;.#endi
2c3e0 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  f.  if( sqlite3_
2c3f0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74  uri_boolean(((ct
2c400 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2c410 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e  LE_URI) ? zFilen
2c420 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20  ame : 0),.      
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c       "psow", SQL
2c450 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
2c460 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
2c470 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2c480 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  |= UNIXFILE_PSOW
2c490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
2c4a0 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
2c4b0 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29  unix-excl")==0 )
2c4c0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2c4d0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2c4e0 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66  E_EXCL;.  }..#if
2c4f0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
2c500 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
2c510 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
2c520 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
2c530 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
2c540 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2c550 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
2c560 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c570 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
2c580 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74  #endif..  if( ct
2c590 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2c5a0 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20  LE_NOLOCK ){.   
2c5b0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2c5c0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2c5d0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2c5e0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2c5f0 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a  (**(finder_type*
2c600 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29  )pVfs->pAppData)
2c610 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  (zFilename, pNew
2c620 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  );.#if SQLITE_EN
2c630 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2c640 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20  LE.    /* Cache 
2c650 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65  zFilename in the
2c660 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
2c670 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63   (AFP and dotloc
2c680 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a  k override) for.
2c690 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b      ** proxyLock
2c6a0 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70   activation is p
2c6b0 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20  ossible (remote 
2c6c0 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f  proxy is based o
2c6d0 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a  n db name).    *
2c6e0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61  * zFilename rema
2c6f0 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
2c700 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  file is closed, 
2c710 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20  to support */.  
2c720 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43    pNew->lockingC
2c730 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29  ontext = (void*)
2c740 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69  zFilename;.#endi
2c750 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f  f.  }..  if( pLo
2c760 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70  ckingStyle == &p
2c770 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69  osixIoMethods.#i
2c780 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2c790 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2c7a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2c7b0 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b  YLE.    || pLock
2c7c0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73  ingStyle == &nfs
2c7d0 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66  IoMethods.#endif
2c7e0 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  .  ){.    unixEn
2c7f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2c800 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2c810 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2c820 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2c830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c840 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e  {.      /* If an
2c850 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2c860 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
2c870 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
2c880 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
2c890 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
2c8a0 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
2c8b0 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
2c8c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
2c8d0 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
2c8e0 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
2c8f0 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
2c900 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
2c910 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
2c920 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
2c930 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
2c940 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
2c950 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
2c960 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
2c970 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
2c980 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
2c990 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
2c9a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2c9b0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2c9c0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
2c9d0 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
2c9e0 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
2c9f0 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
2ca00 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
2ca10 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
2ca20 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2ca30 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2ca40 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2ca50 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
2ca60 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
2ca70 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
2ca80 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
2ca90 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
2caa0 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
2cab0 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
2cac0 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
2cad0 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
2cae0 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
2caf0 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
2cb00 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
2cb10 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
2cb20 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
2cb30 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
2cb40 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
2cb50 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
2cb60 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
2cb70 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
2cb80 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
2cb90 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
2cba0 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
2cbb0 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
2cbc0 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
2cbd0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2cbe0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2cbf0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
2cc00 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2cc10 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
2cc20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2cc30 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2cc40 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2cc50 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2cc60 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
2cc70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2cc80 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
2cc90 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2cca0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2ccb0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2ccc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
2ccd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
2cce0 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
2ccf0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
2cd00 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
2cd10 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
2cd20 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
2cd30 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
2cd40 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
2cd50 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
2cd60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2cd70 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  EM_BKPT;.    }el
2cd80 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
2cd90 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
2cda0 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
2cdb0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
2cdc0 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
2cdd0 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
2cde0 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
2cdf0 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
2ce00 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
2ce10 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
2ce20 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
2ce30 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
2ce40 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
2ce50 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
2ce60 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
2ce70 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
2ce80 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
2ce90 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2cea0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2ceb0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2cec0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
2ced0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
2cef0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2cf00 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
2cf10 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
2cf20 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2cf30 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2cf40 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
2cf50 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
2cf60 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
2cf70 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
2cf80 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
2cf90 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2cfa0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
2cfb0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
2cfc0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
2cfd0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2cfe0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2cff0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
2d000 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
2d010 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
2d020 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
2d030 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
2d040 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
2d050 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
2d060 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e  name!=0 );.    n
2d070 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29  Filename = (int)
2d080 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
2d090 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
2d0a0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
2d0b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2d0c0 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
2d0d0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
2d0e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2d0f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2d100 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d110 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d120 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
2d130 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
2d140 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
2d150 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
2d160 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2d170 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
2d180 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
2d190 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
2d1a0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2d1b0 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
2d1c0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
2d1d0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2d1e0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2d1f0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2d200 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2d210 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
2d220 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
2d230 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
2d240 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2d250 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2d260 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2d270 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2d280 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
2d290 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
2d2a0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
2d2b0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
2d2c0 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
2d2d0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2d2e0 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
2d2f0 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
2d300 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
2d310 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
2d320 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
2d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d340 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
2d350 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
2d360 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
2d370 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
2d380 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
2d390 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
2d3a0 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
2d3b0 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
2d3c0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
2d3d0 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
2d3e0 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
2d3f0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
2d400 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2d410 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
2d420 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
2d430 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2d440 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
2d450 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2d460 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
2d470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d480 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2d490 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2d4a0 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
2d4b0 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
2d4c0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
2d4d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d4e0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
2d4f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2d500 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2d510 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
2d520 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
2d530 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
2d540 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2d550 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2d560 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2d570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d580 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2d590 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2d5a0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2d5b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
2d5c0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
2d5d0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
2d5e0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
2d5f0 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
2d600 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
2d610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d620 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2d630 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
2d640 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
2d650 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
2d660 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
2d670 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
2d680 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
2d690 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
2d6a0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
2d6b0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2d6c0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2d6d0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2d6e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
2d6f0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
2d700 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
2d710 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
2d720 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
2d730 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
2d740 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
2d750 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74   int i = 0;.  st
2d760 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
2d770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
2d780 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  r = sqlite3_temp
2d790 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69  _directory;..  i
2d7a0 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20  f( !azDirs[0] ) 
2d7b0 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65  azDirs[0] = gete
2d7c0 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
2d7d0 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69  R");.  if( !azDi
2d7e0 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31  rs[1] ) azDirs[1
2d7f0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44  ] = getenv("TMPD
2d800 49 52 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29  IR");.  while(1)
2d810 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d  {.    if( zDir!=
2d820 30 0a 20 20 20 20 20 26 26 20 6f 73 53 74 61 74  0.     && osStat
2d830 28 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a  (zDir, &buf)==0.
2d840 20 20 20 20 20 26 26 20 53 5f 49 53 44 49 52 28       && S_ISDIR(
2d850 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20  buf.st_mode).   
2d860 20 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44    && osAccess(zD
2d870 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29  ir, 03)==0.    )
2d880 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a  {.      return z
2d890 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Dir;.    }.    i
2d8a0 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44  f( i>=sizeof(azD
2d8b0 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2d8c0 72 73 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a  rs[0]) ) break;.
2d8d0 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72      zDir = azDir
2d8e0 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65  s[i++];.  }.  re
2d8f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2d900 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
2d910 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
2d920 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
2d930 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
2d940 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
2d950 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
2d960 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
2d970 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
2d980 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
2d990 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
2d9a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2d9b0 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
2d9c0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2d9d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d9e0 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  Dir;.  int iLimi
2d9f0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27  t = 0;..  /* It'
2da00 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2da10 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2da20 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2da30 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2da40 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2da50 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2da60 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2da70 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2da80 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2da90 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
2daa0 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a  .  zBuf[0] = 0;.
2dab0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2dac0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2dad0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
2dae0 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
2daf0 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
2db00 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
2db10 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
2db20 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20  MPPATH;.  do{.  
2db30 20 20 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c    u64 r;.    sql
2db40 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2db50 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
2db60 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
2db70 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e  >2 );.    zBuf[n
2db80 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf-2] = 0;.    
2db90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2dba0 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73  (nBuf, zBuf, "%s
2dbb0 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
2dbc0 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63  LE_PREFIX"%llx%c
2dbd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dbe0 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c          zDir, r,
2dbf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75   0);.    if( zBu
2dc00 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20  f[nBuf-2]!=0 || 
2dc10 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20  (iLimit++)>10 ) 
2dc20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2dc30 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  ROR;.  }while( o
2dc40 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2dc50 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2dc60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2dc70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2dc80 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2dc90 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2dca0 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2dcb0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2dcc0 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2dcd0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2dce0 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2dcf0 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2dd00 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2dd10 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2dd20 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2dd30 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2dd40 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2dd50 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2dd60 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2dd70 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2dd80 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2dd90 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2dda0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2ddb0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2ddc0 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2ddd0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2dde0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2ddf0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2de00 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2de10 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2de20 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2de30 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2de40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2de50 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2de60 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2de70 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2de80 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2de90 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2dea0 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2deb0 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2dec0 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2ded0 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2dee0 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2def0 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2df00 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2df10 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2df20 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2df30 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2df40 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2df50 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2df60 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2df70 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2df80 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2df90 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2dfa0 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2dfb0 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2dfc0 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2dfd0 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2dfe0 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2dff0 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2e000 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2e010 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2e020 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2e030 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
2e040 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2e050 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
2e060 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
2e070 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
2e080 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
2e090 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
2e0a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2e0b0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
2e0c0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
2e0d0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2e0e0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
2e0f0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2e100 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
2e110 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
2e120 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2e130 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
2e140 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
2e150 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
2e160 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
2e170 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
2e180 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
2e190 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
2e1a0 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
2e1b0 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
2e1c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
2e1d0 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
2e1e0 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
2e1f0 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
2e200 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
2e210 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
2e220 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
2e230 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
2e240 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
2e250 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
2e260 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2e270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e280 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
2e290 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69 78 45  call */..  unixE
2e2a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
2e2b0 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c  /* A stat() call
2e2c0 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61   may fail for va
2e2d0 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49  rious reasons. I
2e2e0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
2e2f0 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73  it is.  ** almos
2e300 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61  t certain that a
2e310 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e  n open() call on
2e320 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77   the same path w
2e330 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20  ill also fail.. 
2e340 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61   ** For this rea
2e350 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  son, if an error
2e360 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73   occurs in the s
2e370 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c  tat() call here,
2e380 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f   it is.  ** igno
2e390 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65  red and -1 is re
2e3a0 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
2e3b0 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f  er will try to o
2e3c0 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20  pen a new file. 
2e3d0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f   ** descriptor o
2e3e0 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c  n the same path,
2e3f0 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72   fail, and retur
2e400 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51  n an error to SQ
2e410 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Lite..  **.  ** 
2e420 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71  Even if a subseq
2e430 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c  uent open() call
2e440 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74   does succeed, t
2e450 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20  he consequences 
2e460 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72  of.  ** not sear
2e470 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73  ching for a reus
2e480 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
2e490 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
2e4a0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 55 6e  e.  */.  if( nUn
2e4b0 75 73 65 64 46 64 3e 30 20 26 26 20 30 3d 3d 6f  usedFd>0 && 0==o
2e4c0 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53  sStat(zPath, &sS
2e4d0 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  tat) ){.    unix
2e4e0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
2e4f0 65 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  e;..    pInode =
2e500 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
2e510 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
2e520 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
2e530 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
2e540 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
2e550 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
2e560 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28  e->fileId.ino!=(
2e570 75 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u64)sStat.st_ino
2e580 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f  ) ){.       pIno
2e590 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
2e5a0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
2e5b0 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
2e5c0 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2e5d0 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
2e5e0 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  p=&pInode->pUnus
2e5f0 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29  ed; *pp && (*pp)
2e600 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20  ->flags!=flags; 
2e610 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
2e620 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73  t));.      pUnus
2e630 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20  ed = *pp;.      
2e640 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2e650 20 20 20 20 20 20 20 6e 55 6e 75 73 65 64 46 64         nUnusedFd
2e660 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 20  --;.        *pp 
2e670 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2e680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e690 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
2e6a0 75 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 20 20  utex();.#endif  
2e6b0 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f    /* if !OS_VXWO
2e6c0 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  RKS */.  return 
2e6d0 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  pUnused;.}../*.*
2e6e0 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c  * Find the mode,
2e6f0 20 75 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20   uid and gid of 
2e700 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a  file zFile. .*/.
2e710 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 46 69  static int getFi
2e720 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2e730 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20  char *zFile,    
2e740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
2e750 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65  e name */.  mode
2e760 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2e770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e780 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2e790 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69  of zFile */.  ui
2e7a0 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e7c0 20 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69   OUT: uid of zFi
2e7d0 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  le. */.  gid_t *
2e7e0 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
2e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e800 20 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a   gid of zFile. *
2e810 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74  /.){.  struct st
2e820 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2e830 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2e840 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61   of stat() on da
2e850 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2e860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e870 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73  _OK;.  if( 0==os
2e880 53 74 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74  Stat(zFile, &sSt
2e890 61 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  at) ){.    *pMod
2e8a0 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
2e8b0 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70  e & 0777;.    *p
2e8c0 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75  Uid = sStat.st_u
2e8d0 69 64 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20  id;.    *pGid = 
2e8e0 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
2e8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2e900 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2e910 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  AT;.  }.  return
2e920 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2e930 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2e940 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65  alled by unixOpe
2e950 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  n() to determine
2e960 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73   the unix permis
2e970 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61  sions.** to crea
2e980 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74  te new files wit
2e990 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  h. If no error o
2e9a0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2e9b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2e9c0 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65  d.** and a value
2e9d0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61   suitable for pa
2e9e0 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69  ssing as the thi
2e9f0 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  rd argument to o
2ea00 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69  pen(2) is.** wri
2ea10 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20  tten to *pMode. 
2ea20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2ea30 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
2ea40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
2ea50 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
2ea60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d  the value of *pM
2ea70 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66  ode is not modif
2ea80 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f  ied..**.** In mo
2ea90 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20 72  st cases, this r
2eaa0 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f  outine sets *pMo
2eab0 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77  de to 0, which w
2eac0 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e  ill become.** an
2ead0 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72   indication to r
2eae0 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20  obust_open() to 
2eaf0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20  create the file 
2eb00 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
2eb10 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2eb20 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65  MISSIONS adjuste
2eb30 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
2eb40 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69  ** But if the fi
2eb50 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2eb60 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
2eb70 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2eb80 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
2eb90 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
2eba0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2ebb0 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
2ebc0 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
2ebd0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
2ebe0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2ebf0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
2ec00 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
2ec10 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
2ec20 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
2ec30 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
2ec40 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
2ec50 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
2ec60 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
2ec70 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2ec80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2ec90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2eca0 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
2ecb0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2ecc0 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
2ecd0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
2ece0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
2ecf0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
2ed00 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
2ed10 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
2ed20 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
2ed30 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
2ed40 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
2ed50 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
2ed60 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
2ed70 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
2ed80 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
2ed90 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2edb0 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
2edc0 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
2edd0 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
2ede0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ee00 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
2ee10 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
2ee20 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
2ee30 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ee50 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
2ee60 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
2ee70 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
2ee80 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2ee90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2eea0 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2eeb0 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
2eec0 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
2eed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2eee0 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
2eef0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
2ef00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ef10 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ef20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2ef30 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30   */.  *pMode = 0
2ef40 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20  ;.  *pUid = 0;. 
2ef50 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66   *pGid = 0;.  if
2ef60 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
2ef70 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
2ef80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2ef90 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
2efa0 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
2efb0 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
2efc0 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
2efd0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
2efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eff0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f000 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
2f010 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   zDb */..    /* 
2f020 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20  zPath is a path 
2f030 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72  to a WAL or jour
2f040 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f  nal file. The fo
2f050 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65  llowing block de
2f060 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  rives.    ** the
2f070 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73   path to the ass
2f080 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2f090 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68   file from zPath
2f0a0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  . This block han
2f0b0 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  dles.    ** the 
2f0c0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67  following naming
2f0d0 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20   conventions:.  
2f0e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c    **.    **   "<
2f0f0 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2f100 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  nal".    **   "<
2f110 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22  path to db>-wal"
2f120 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f130 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e   to db>-journalN
2f140 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
2f150 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22  th to db>-walNN"
2f160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77  .    **.    ** w
2f170 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63  here NN is a dec
2f180 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65  imal number. The
2f190 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d   NN naming schem
2f1a0 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75  es are .    ** u
2f1b0 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  sed by the test_
2f1c0 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
2f1d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
2f1e0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Db = sqlite3Strl
2f1f0 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b  en30(zPath) - 1;
2f200 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61   .    while( zPa
2f210 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a  th[nDb]!='-' ){.
2f220 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d        /* In norm
2f230 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68  al operation, th
2f240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
2f250 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ame will always 
2f260 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a  contain.      **
2f270 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72   a '-' character
2f280 2e 20 20 48 6f 77 65 76 65 72 20 69 6e 20 38 2b  .  However in 8+
2f290 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c  3 filename mode,
2f2a0 20 6f 72 20 69 66 20 61 20 63 6f 72 72 75 70 74   or if a corrupt
2f2b0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
2f2c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69  ck journal speci
2f2d0 66 69 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  fies a master jo
2f2e0 75 72 6e 61 6c 20 77 69 74 68 20 61 20 67 6f 6f  urnal with a goo
2f2f0 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20  fy name, then.  
2f300 20 20 20 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d      ** the '-' m
2f310 69 67 68 74 20 62 65 20 6d 69 73 73 69 6e 67 2e  ight be missing.
2f320 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44   */.      if( nD
2f330 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44  b==0 || zPath[nD
2f340 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e  b]=='.' ) return
2f350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f360 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20    nDb--;.    }. 
2f370 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a     memcpy(zDb, z
2f380 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20  Path, nDb);.    
2f390 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b  zDb[nDb] = '\0';
2f3a0 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46 69  ..    rc = getFi
2f3b0 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64  leMode(zDb, pMod
2f3c0 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a  e, pUid, pGid);.
2f3d0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2f3e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f3f0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
2f400 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
2f410 30 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  00;.  }else if( 
2f420 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2f430 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 2f  PEN_URI ){.    /
2f440 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6d  * If this is a m
2f450 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2f460 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 77  e and the file w
2f470 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  as opened using 
2f480 61 20 55 52 49 0a 20 20 20 20 2a 2a 20 66 69 6c  a URI.    ** fil
2f490 65 6e 61 6d 65 2c 20 63 68 65 63 6b 20 66 6f 72  ename, check for
2f4a0 20 74 68 65 20 22 6d 6f 64 65 6f 66 22 20 70 61   the "modeof" pa
2f4b0 72 61 6d 65 74 65 72 2e 20 49 66 20 70 72 65 73  rameter. If pres
2f4c0 65 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 0a 20  ent, interpret. 
2f4d0 20 20 20 2a 2a 20 69 74 73 20 76 61 6c 75 65 20     ** its value 
2f4e0 61 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 61 6e  as a filename an
2f4f0 64 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68  d try to copy th
2f500 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20  e mode, uid and 
2f510 67 69 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  gid from.    ** 
2f520 74 68 61 74 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  that file.  */. 
2f530 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2f540 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
2f550 61 72 61 6d 65 74 65 72 28 7a 50 61 74 68 2c 20  arameter(zPath, 
2f560 22 6d 6f 64 65 6f 66 22 29 3b 0a 20 20 20 20 69  "modeof");.    i
2f570 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 72 63  f( z ){.      rc
2f580 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a   = getFileMode(z
2f590 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70  , pMode, pUid, p
2f5a0 47 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Gid);.    }.  }.
2f5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f5c0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
2f5d0 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
2f5e0 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
2f5f0 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
2f600 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
2f610 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
2f620 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
2f630 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
2f640 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
2f650 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2f660 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
2f670 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2f680 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2f690 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
2f6a0 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
2f6b0 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
2f6c0 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
2f6d0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2f6e0 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
2f6f0 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
2f700 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
2f710 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
2f720 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
2f730 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
2f740 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
2f750 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
2f760 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
2f770 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
2f780 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
2f790 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
2f7a0 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
2f7b0 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
2f7c0 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
2f7d0 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
2f7e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2f7f0 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
2f800 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
2f810 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
2f820 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
2f830 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
2f840 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
2f850 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
2f860 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
2f870 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
2f880 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
2f890 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
2f8a0 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
2f8b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2f8c0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2f8d0 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
2f8e0 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
2f8f0 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
2f900 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2f910 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2f920 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
2f930 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
2f940 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2f950 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
2f960 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
2f970 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
2f980 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
2f990 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f9b0 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
2f9c0 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
2f9d0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
2f9e0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
2f9f0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
2fa00 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
2fa10 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
2fa20 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
2fa30 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2fa40 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
2fa50 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
2fa60 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2fa70 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
2fa80 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
2fa90 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2faa0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fab0 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2fac0 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
2fad0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
2fae0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
2faf0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
2fb00 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2fb10 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fb30 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
2fb40 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
2fb50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2fb60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2fb70 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
2fb80 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2fb90 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20  int ctrlFlags = 
2fba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2fbb0 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61  * UNIXFILE_* fla
2fbc0 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45  gs */..  int isE
2fbd0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
2fbe0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2fbf0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
2fc00 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
2fc10 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2fc20 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2fc30 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
2fc40 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
2fc50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2fc60 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
2fc70 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
2fc80 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2fc90 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2fca0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
2fcb0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2fcc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2fcd0 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  TE);.#if SQLITE_
2fce0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2fcf0 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74  TYLE.  int isAut
2fd00 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73  oProxy  = (flags
2fd10 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41   & SQLITE_OPEN_A
2fd20 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69  UTOPROXY);.#endi
2fd30 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
2fd40 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
2fd50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2fd60 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
2fd70 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2fd80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2fd90 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
2fda0 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
2fdb0 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
2fdc0 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
2fdd0 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
2fde0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
2fdf0 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
2fe00 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
2fe10 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
2fe20 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
2fe30 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
2fe40 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
2fe50 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
2fe60 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73  )d..  */.  int s
2fe70 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61  yncDir = (isCrea
2fe80 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
2fe90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2fea0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2feb0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2fec0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2fed0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
2fee0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2fef0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
2ff00 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2ff10 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
2ff20 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
2ff30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
2ff40 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
2ff50 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
2ff60 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
2ff70 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
2ff80 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
2ff90 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
2ffa0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
2ffb0 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+2];.  const ch
2ffc0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
2ffd0 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
2ffe0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
2fff0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
30000 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
30010 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
30020 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
30030 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
30040 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
30050 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
30060 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
30070 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
30080 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
30090 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
300a0 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
300b0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
300c0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
300d0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
300e0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
300f0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
30100 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
30110 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
30120 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
30130 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
30140 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
30150 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
30160 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
30170 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
30180 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
30190 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
301a0 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
301b0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
301c0 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
301d0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
301e0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
301f0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
30200 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
30210 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
30220 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
30230 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
30240 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
30250 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
30260 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
30270 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
30280 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
30290 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
302a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
302b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
302c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
302d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
302e0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
302f0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
30300 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
30310 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
30320 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
30330 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
30340 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
30350 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
30360 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
30370 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
30380 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
30390 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
303a0 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
303b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
303c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
303d0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
303e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
303f0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
30400 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
30410 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30420 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
30430 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
30440 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
30450 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
30460 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
30470 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
30480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
30490 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
304a0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
304b0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
304c0 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
304d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
304e0 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63    );..  /* Detec
304f0 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20 61  t a pid change a
30500 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52 4e  nd reset the PRN
30510 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 72  G.  There is a r
30520 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20  ace condition.  
30530 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68 61  ** here such tha
30540 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68  t two or more th
30550 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67  reads all trying
30560 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
30570 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  es at.  ** the s
30580 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68  ame instant migh
30590 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20  t all reset the 
305a0 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69  PRNG.  But multi
305b0 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20  ple resets.  ** 
305c0 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20  are harmless..  
305d0 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e  */.  if( randomn
305e0 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64  essPid!=osGetpid
305f0 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f  (0) ){.    rando
30600 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74  mnessPid = osGet
30610 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69  pid(0);.    sqli
30620 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30  te3_randomness(0
30630 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73  ,0);.  }..  mems
30640 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
30650 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69  unixFile));..  i
30660 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
30670 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
30680 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46  .    UnixUnusedF
30690 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20  d *pUnused;.    
306a0 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
306b0 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20  usableFd(zName, 
306c0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
306d0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
306e0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
306f0 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
30700 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71      pUnused = sq
30710 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
30720 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29  izeof(*pUnused))
30730 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55 6e  ;.      if( !pUn
30740 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
30750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30760 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
30770 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
30780 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
30790 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20  ed = pUnused;.. 
307a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
307b0 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
307c0 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
307d0 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
307e0 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20  not.    ** URIs 
307f0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
30800 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
30810 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
30820 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73  ed into.    ** s
30830 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
30840 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
30850 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
30860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
30870 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e   || zName[strlen
30880 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
30890 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ..  }else if( !z
308a0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
308b0 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
308c0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
308d0 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
308e0 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
308f0 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
30900 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b  te && !syncDir);
30910 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
30920 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e  tTempname(pVfs->
30930 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d 70  mxPathname, zTmp
30940 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
30950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30970 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
30980 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20   = zTmpname;..  
30990 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74    /* Generated t
309a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
309b0 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f  es are always do
309c0 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
309d0 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ated.    ** for 
309e0 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75  use by sqlite3_u
309f0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
30a00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
30a10 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
30a20 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  e)+1]==0 );.  }.
30a30 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
30a40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
30a50 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
30a60 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
30a70 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
30a80 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
30a90 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
30aa0 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
30ab0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
30ac0 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
30ad0 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
30ae0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
30af0 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
30b00 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
30b10 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
30b20 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
30b30 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
30b40 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
30b50 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
30b60 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
30b70 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
30b80 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
30b90 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
30ba0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
30bb0 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
30bc0 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
30bd0 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
30be0 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
30bf0 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
30c00 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
30c10 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
30c20 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
30c30 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
30c40 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e     /* Permission
30c50 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65  s to create file
30c60 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64   with */.    uid
30c70 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20  _t uid;         
30c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
30c90 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  erid for the fil
30ca0 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67  e */.    gid_t g
30cb0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
30cc0 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
30cd0 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
30ce0 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43  /.    rc = findC
30cf0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
30d00 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65  ame, flags, &ope
30d10 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
30d20 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
30d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30d40 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
30d50 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
30d60 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
30d70 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
30d80 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
30d90 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
30da0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
30db0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
30dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
30dd0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
30de0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
30df0 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
30e00 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
30e10 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
30e20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
30e30 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65  lags));.    asse
30e40 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76 65  rt( !isExclusive
30e50 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26   || (openFlags &
30e60 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a   O_CREAT)!=0 );.
30e70 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
30e80 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
30e90 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
30ea0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
30eb0 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
30ec0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
30ed0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
30ee0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
30ef0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
30f00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
30f10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
30f20 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
30f30 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
30f40 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
30f50 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
30f60 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
30f70 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
30f80 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
30f90 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
30fa0 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
30fb0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
30fc0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
30fd0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
30fe0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
30ff0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
31000 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
31010 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
31020 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
31030 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
31040 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
31050 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
31060 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
31070 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
31080 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
31090 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
310a0 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
310b0 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
310c0 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
310d0 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
310e0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
310f0 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
31100 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
31110 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
31120 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
31130 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
31140 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
31150 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
31160 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b  n(fd, uid, gid);
31170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
31180 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
31190 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
311a0 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
311b0 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
311c0 69 66 28 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  if( p->pPrealloc
311d0 61 74 65 64 55 6e 75 73 65 64 20 29 7b 0a 20 20  atedUnused ){.  
311e0 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74    p->pPreallocat
311f0 65 64 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  edUnused->fd = f
31200 64 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c  d;.    p->pPreal
31210 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66  locatedUnused->f
31220 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
31230 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  }..  if( isDelet
31240 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  e ){.#if OS_VXWO
31250 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  RKS.    zPath = 
31260 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66  zName;.#elif def
31270 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49  ined(SQLITE_UNLI
31280 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a  NK_AFTER_CLOSE).
31290 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71 6c 69      zPath = sqli
312a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
312b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
312c0 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20  ( zPath==0 ){.  
312d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
312e0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
312f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
31300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
31310 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
31320 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
31330 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
31340 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
31350 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
31360 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
31370 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
31380 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
31390 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
313a0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
313b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
313c0 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
313d0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
313e0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
313f0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
31400 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  p, errno);.    r
31410 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
31420 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
31430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31440 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
31450 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
31460 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73  ncmp("msdos", fs
31470 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
31480 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
31490 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
314a0 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
314b0 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
314c0 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  DOS;.  }.  if (0
314d0 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66   == strncmp("exf
314e0 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  at", fsInfo.f_fs
314f0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
31500 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
31510 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
31520 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
31530 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
31540 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
31550 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20   up appropriate 
31560 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69  ctrlFlags */.  i
31570 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20  f( isDelete )   
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
31590 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
315a0 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28  LE_DELETE;.  if(
315b0 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20   isReadonly )   
315c0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
315d0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
315e0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63  _RDONLY;.  noLoc
315f0 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54  k = eType!=SQLIT
31600 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a  E_OPEN_MAIN_DB;.
31610 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20    if( noLock )  
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31630 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
31640 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20  XFILE_NOLOCK;.  
31650 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20  if( syncDir )   
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
31670 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
31680 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69  ILE_DIRSYNC;.  i
31690 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
316a0 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72  E_OPEN_URI ) ctr
316b0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
316c0 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c  LE_URI;..#if SQL
316d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
316e0 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c  NG_STYLE.#if SQL
316f0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
31700 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74  _LOCKING.  isAut
31710 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64  oProxy = 1;.#end
31720 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50  if.  if( isAutoP
31730 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d  roxy && (zPath!=
31740 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63  NULL) && (!noLoc
31750 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  k) && pVfs->xOpe
31760 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65  n ){.    char *e
31770 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76  nvforce = getenv
31780 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  ("SQLITE_FORCE_P
31790 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a  ROXY_LOCKING");.
317a0 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79      int useProxy
317b0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51   = 0;..    /* SQ
317c0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
317d0 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e  _LOCKING==1 mean
317e0 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75  s force always u
317f0 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e  se proxy, 0 mean
31800 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20  s .    ** never 
31810 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20  use proxy, NULL 
31820 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20  means use proxy 
31830 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69  for non-local fi
31840 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  les only.  */.  
31850 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d    if( envforce!=
31860 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73  NULL ){.      us
31870 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e  eProxy = atoi(en
31880 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d  vforce)>0;.    }
31890 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50  else{.      useP
318a0 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e  roxy = !(fsInfo.
318b0 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41  f_flags&MNT_LOCA
318c0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
318d0 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20  ( useProxy ){.  
318e0 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55      rc = fillInU
318f0 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64  nixFile(pVfs, fd
31900 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20  , pFile, zPath, 
31910 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
31920 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
31940 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  c = proxyTransfo
31950 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78  rmUnixFile((unix
31960 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61  File*)pFile, ":a
31970 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  uto:");.        
31980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  K ){.          /
319a0 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20  * Use unixClose 
319b0 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
319c0 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20  resources added 
319d0 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c  in fillInUnixFil
319e0 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
319f0 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68  and clear all th
31a00 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65  e structure's re
31a10 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69  ferences.  Speci
31a20 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20  fically, .      
31a30 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d      ** pFile->pM
31a40 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e  ethods will be N
31a50 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73  ULL so sqlite3Os
31a60 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20  Close will be a 
31a70 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20  no-op .         
31a80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
31a90 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a  ixClose(pFile);.
31aa0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
31ab0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
31ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
31ad0 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
31ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
31af0 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 7a  f.  .  assert( z
31b00 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68  Path==0 || zPath
31b10 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20  [0]=='/' .      
31b20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
31b30 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
31b40 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
31b50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31b60 4a 4f 55 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20  JOURNAL .  );.  
31b70 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
31b80 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
31b90 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
31ba0 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
31bb0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
31bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31bd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31be0 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
31bf0 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72  Unused);.  }.  r
31c00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
31c10 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
31c20 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66  ile at zPath. If
31c30 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67   the dirSync arg
31c40 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66  ument is true, f
31c50 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69  sync().** the di
31c60 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
31c70 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
31c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
31c90 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  nixDelete(.  sql
31ca0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31cb0 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f  d,     /* VFS co
31cc0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73  ntaining this as
31cd0 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74   the xDelete met
31ce0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
31cf0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
31d00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
31d10 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
31d20 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e   */.  int dirSyn
31d30 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
31d40 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e  /* If true, fsyn
31d50 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66  c() directory af
31d60 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c  ter deleting fil
31d70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
31d80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31d90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31da0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
31db0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
31dc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
31dd0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20  _DELETE);.  if( 
31de0 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d  osUnlink(zPath)=
31df0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28  =(-1) ){.    if(
31e00 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23   errno==ENOENT.#
31e10 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
31e20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73        || osAcces
31e30 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65  s(zPath,0)!=0.#e
31e40 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
31e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
31e60 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
31e70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31e80 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
31e90 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
31ea0 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e  R_DELETE, "unlin
31eb0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
31ec0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
31ed0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
31ee0 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
31ef0 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79  YNC.  if( (dirSy
31f00 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20  nc & 1)!=0 ){.  
31f10 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63    int fd;.    rc
31f20 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f   = osOpenDirecto
31f30 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a  ry(zPath, &fd);.
31f40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
31f60 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64  f( full_fsync(fd
31f70 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ,0,0) ){.       
31f80 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
31f90 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
31fa0 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
31fb0 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
31fc0 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
31fd0 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
31fe0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
31ff0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
32000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
32010 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
32020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
32030 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
32040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32050 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
32060 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
32070 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
32080 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
32090 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
320a0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
320b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
320c0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
320d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
320e0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
320f0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
32100 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
32110 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
32120 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
32130 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
32140 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
32150 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
32160 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
32170 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
32180 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
32190 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
321a0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
321b0 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
321c0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
321d0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
321e0 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
321f0 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
32200 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
32210 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32220 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
32230 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
32240 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
32250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32260 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
32270 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
32280 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
32290 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
322a0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
322b0 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
322c0 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
322d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
322e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
322f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
32300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
32310 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
32320 20 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75    assert( pResOu
32330 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  t!=0 );..  /* Th
32340 65 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72  e spec says ther
32350 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
32360 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
32370 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79  flags.  But only
32380 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65  .  ** two of the
32390 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  m are actually u
323a0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
323b0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
323c0 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20  CCESS_EXISTS || 
323d0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
323e0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29  CESS_READWRITE )
323f0 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  ;..  if( flags==
32400 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32410 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75  ISTS ){.    stru
32420 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
32430 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d   *pResOut = (0==
32440 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
32450 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
32460 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ze>0);.  }else{.
32470 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f      *pResOut = o
32480 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57  sAccess(zPath, W
32490 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20  _OK|R_OK)==0;.  
324a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
324b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  E_OK;.}../*.**.*
324c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6b 46  /.static int mkF
324d0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 63  ullPathname(.  c
324e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
324f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32500 2a 20 49 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  * Input path */.
32510 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20    char *zOut,   
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
32540 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74  er */.  int nOut
32550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32560 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
32570 61 74 65 64 20 73 69 7a 65 20 6f 66 20 62 75 66  ated size of buf
32580 66 65 72 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20  fer zOut */.){. 
32590 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 71 6c   int nPath = sql
325a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
325b0 74 68 29 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  th);.  int iOff 
325c0 3d 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  = 0;.  if( zPath
325d0 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]!='/' ){.    
325e0 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
325f0 74 2c 20 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b  t, nOut-2)==0 ){
32600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
32610 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
32620 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
32630 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
32640 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  );.    }.    iOf
32650 66 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  f = sqlite3Strle
32660 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a  n30(zOut);.    z
32670 4f 75 74 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f  Out[iOff++] = '/
32680 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 4f  ';.  }.  if( (iO
32690 66 66 2b 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74  ff+nPath+1)>nOut
326a0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74   ){.    /* SQLit
326b0 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 78  e assumes that x
326c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e  FullPathname() n
326d0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 73 20 74 68  ul-terminates th
326e0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 0a  e output buffer.
326f0 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69      ** even if i
32700 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  t returns an err
32710 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74  or.  */.    zOut
32720 5b 69 4f 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20  [iOff] = '\0';. 
32730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32740 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
32750 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
32760 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66  printf(nOut-iOff
32770 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22  , &zOut[iOff], "
32780 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72  %s", zPath);.  r
32790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
327a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
327b0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
327c0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
327d0 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
327e0 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
327f0 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
32800 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
32810 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
32820 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
32830 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
32840 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
32850 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
32860 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
32870 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
32880 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
32890 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
328a0 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
328b0 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
328c0 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
328d0 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
328e0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
328f0 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
32900 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
32910 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
32920 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
32930 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
32940 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
32950 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
32960 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
32970 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
32980 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
329b0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
329c0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
329d0 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
329e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
329f0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
32a00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41  .#if !defined(HA
32a10 56 45 5f 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20  VE_READLINK) || 
32a20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 53  !defined(HAVE_LS
32a30 54 41 54 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b  TAT).  return mk
32a40 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61  FullPathname(zPa
32a50 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b  th, zOut, nOut);
32a60 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 20  .#else.  int rc 
32a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
32a80 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
32a90 6e 4c 69 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20  nLink = 1;      
32aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32ab0 62 65 72 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20  ber of symbolic 
32ac0 6c 69 6e 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73  links followed s
32ad0 6f 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  o far */.  const
32ae0 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61   char *zIn = zPa
32af0 74 68 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75  th;      /* Inpu
32b00 74 20 70 61 74 68 20 66 6f 72 20 65 61 63 68 20  t path for each 
32b10 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f  iteration of loo
32b20 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  p */.  char *zDe
32b30 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
32b40 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
32b50 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
32b60 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
32b70 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
32b80 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
32b90 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
32ba0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
32bb0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
32bc0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
32bd0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
32be0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
32bf0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
32c00 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
32c10 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
32c20 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
32c30 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
32c40 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
32c50 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
32c60 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
32c70 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
32c80 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
32c90 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
32ca0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
32cb0 0a 0a 20 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a  ..  do {..    /*
32cc0 20 43 61 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20   Call stat() on 
32cd0 70 61 74 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c  path zIn. Set bL
32ce0 69 6e 6b 20 74 6f 20 74 72 75 65 20 69 66 20 74  ink to true if t
32cf0 68 65 20 70 61 74 68 20 69 73 20 61 20 73 79 6d  he path is a sym
32d00 62 6f 6c 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e  bolic.    ** lin
32d10 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  k, or false othe
32d20 72 77 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69  rwise.  */.    i
32d30 6e 74 20 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20  nt bLink = 0;.  
32d40 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
32d50 66 3b 0a 20 20 20 20 69 66 28 20 6f 73 4c 73 74  f;.    if( osLst
32d60 61 74 28 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30  at(zIn, &buf)!=0
32d70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
32d80 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno!=ENOENT ){. 
32d90 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
32da0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
32db0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
32dc0 6c 73 74 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20  lstat", zIn);.  
32dd0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
32de0 0a 20 20 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53  .      bLink = S
32df0 5f 49 53 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f  _ISLNK(buf.st_mo
32e00 64 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  de);.    }..    
32e10 69 66 28 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20  if( bLink ){.   
32e20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29     if( zDel==0 )
32e30 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 20 3d  {.        zDel =
32e40 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
32e50 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 69  nOut);.        i
32e60 66 28 20 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20  f( zDel==0 ) rc 
32e70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
32e80 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
32e90 20 69 66 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c   if( ++nLink>SQL
32ea0 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53  ITE_MAX_SYMLINKS
32eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32ec0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
32ed0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a  _BKPT;.      }..
32ee0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32f00 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65 61     nByte = osRea
32f10 64 6c 69 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c  dlink(zIn, zDel,
32f20 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 20 20 20 20   nOut-1);.      
32f30 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
32f40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32f50 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
32f60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
32f70 54 2c 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a  T, "readlink", z
32f80 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  In);.        }el
32f90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
32fa0 28 20 7a 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29  ( zDel[0]!='/' )
32fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
32fc0 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t n;.           
32fd0 20 66 6f 72 28 6e 20 3d 20 73 71 6c 69 74 65 33   for(n = sqlite3
32fe0 53 74 72 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e  Strlen30(zIn); n
32ff0 3e 30 20 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d  >0 && zIn[n-1]!=
33000 27 2f 27 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20  '/'; n--);.     
33010 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65         if( nByte
33020 2b 6e 2b 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  +n+1>nOut ){.   
33030 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
33040 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
33050 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
33060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33070 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
33080 7a 44 65 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e  zDel[n], zDel, n
33090 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20  Byte+1);.       
330a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 44         memcpy(zD
330b0 65 6c 2c 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20  el, zIn, n);.   
330c0 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
330d0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
330e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
330f0 0a 20 20 20 20 20 20 20 20 20 20 7a 44 65 6c 5b  .          zDel[
33100 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20  nByte] = '\0';. 
33110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33120 0a 0a 20 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44  ..      zIn = zD
33130 65 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  el;.    }..    a
33140 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33150 45 5f 4f 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75  E_OK || zIn!=zOu
33160 74 20 7c 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27  t || zIn[0]=='/'
33170 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
33180 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e  SQLITE_OK && zIn
33190 21 3d 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  !=zOut ){.      
331a0 72 63 20 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e  rc = mkFullPathn
331b0 61 6d 65 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e  ame(zIn, zOut, n
331c0 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Out);.    }.    
331d0 69 66 28 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62  if( bLink==0 ) b
331e0 72 65 61 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20  reak;.    zIn = 
331f0 7a 4f 75 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  zOut;.  }while( 
33200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33210 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
33220 28 7a 44 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zDel);.  return
33230 20 72 63 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a   rc;.#endif   /*
33240 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26   HAVE_READLINK &
33250 26 20 48 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a  & HAVE_LSTAT */.
33260 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
33270 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
33280 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
33290 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
332a0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
332b0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
332c0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
332d0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
332e0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
332f0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
33300 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
33310 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
33320 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
33330 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
33340 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
33350 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
33360 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
33370 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33380 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
33390 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
333a0 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
333b0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
333c0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
333d0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
333e0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
333f0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
33400 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
33410 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
33420 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
33430 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
33440 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
33450 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
33460 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
33470 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
33480 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
33490 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
334a0 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
334b0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
334c0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
334d0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
334e0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
334f0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
33500 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
33510 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
33520 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
33530 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
33540 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
33550 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33560 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
33570 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
33580 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
33590 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
335a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
335b0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
335c0 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
335d0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
335e0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
335f0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
33600 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
33610 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
33620 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
33630 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
33640 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
33650 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
33660 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
33670 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
33680 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
33690 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
336a0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
336b0 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
336c0 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
336d0 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
336e0 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
336f0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
33700 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
33710 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
33720 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
33730 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
33740 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
33750 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
33760 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
33770 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
33780 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
33790 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
337a0 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
337b0 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
337c0 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
337d0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
337e0 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
337f0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
33800 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
33810 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
33820 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
33830 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
33840 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
33850 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
33860 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
33870 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
33880 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
33890 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
338a0 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
338b0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
338c0 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
338d0 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
338e0 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
338f0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
33900 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
33910 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
33920 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
33930 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
33940 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
33950 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
33960 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
33970 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
33980 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
33990 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
339a0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
339b0 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
339c0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
339d0 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
339e0 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
339f0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
33a00 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
33a10 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
33a20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
33a30 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
33a40 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33a50 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
33a60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33a70 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
33a80 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
33a90 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
33aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
33ab0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
33ac0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
33ad0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
33ae0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
33af0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
33b00 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
33b10 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
33b20 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
33b30 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
33b40 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
33b50 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
33b60 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
33b70 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
33b80 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
33b90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33ba0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
33bb0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
33bc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33bd0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
33be0 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
33bf0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
33c00 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
33c10 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
33c20 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
33c30 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
33c40 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
33c50 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
33c60 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
33c70 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
33c80 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
33c90 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
33ca0 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
33cb0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
33cc0 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
33cd0 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
33ce0 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
33cf0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
33d00 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
33d10 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
33d20 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
33d30 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
33d40 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
33d50 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
33d60 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
33d70 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
33d80 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
33d90 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
33da0 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
33db0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
33dc0 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
33dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
33de0 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
33df0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
33e00 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
33e10 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
33e20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
33e30 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
33e40 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
33e50 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
33e60 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
33e70 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
33e80 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
33e90 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72  f, 0, nBuf);.  r
33ea0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
33eb0 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69  sGetpid(0);  .#i
33ec0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
33ed0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
33ee0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
33ef0 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a  RANDOMNESS).  {.
33f00 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
33f10 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
33f20 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
33f30 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
33f40 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
33f50 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
33f60 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
33f70 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
33f80 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
33f90 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
33fa0 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
33fb0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
33fc0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
33fd0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
33fe0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
33ff0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
34000 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
34010 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
34020 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
34030 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
34040 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
34050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
34060 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
34070 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
34080 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
34090 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
340a0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
340b0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
340c0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
340d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
340e0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
340f0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
34100 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
34110 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
34120 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
34130 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
34140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
34150 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
34160 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
34170 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
34180 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
34190 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
341a0 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
341b0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
341c0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
341d0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
341e0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
341f0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
34200 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
34210 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
34220 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
34230 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
34240 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
34250 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
34260 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34270 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
34280 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
34290 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
342a0 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
342b0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
342c0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
342d0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
342e0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
342f0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
34300 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
34310 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
34320 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34330 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
34340 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
34350 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
34360 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
34370 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
34380 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
34390 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
343a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
343b0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
343c0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
343d0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
343e0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
343f0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
34400 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
34410 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34420 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
34430 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
34440 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
34450 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
34460 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
34470 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
34480 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
34490 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
344a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
344b0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
344c0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
344d0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
344e0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
344f0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
34500 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
34510 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
34520 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
34530 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
34540 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
34550 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
34560 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
34570 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
34580 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
34590 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
345a0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
345b0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
345c0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
345d0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
345e0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
345f0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
34600 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
34610 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
34620 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
34630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
34640 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
34650 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
34660 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
34670 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
34680 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
34690 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
346a0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
346b0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
346c0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
346d0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
346e0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
346f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
34700 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
34710 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
34720 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
34730 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
34740 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
34750 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
34760 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
34770 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
34780 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
34790 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
347a0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
347b0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
347c0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
347d0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
347e0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
347f0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
34800 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
34810 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
34820 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
34830 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
34840 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
34850 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
34860 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
34870 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
34880 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
34890 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
348a0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
348b0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
348c0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
348d0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
348e0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
348f0 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74  Now;.  (void)get
34900 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
34910 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20   0);  /* Cannot 
34920 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64  fail given valid
34930 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
34940 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
34950 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
34960 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
34970 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75  _sec + sNow.tv_u
34980 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66  sec/1000;.#endif
34990 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
349a0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
349b0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
349c0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
349d0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
349e0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
349f0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
34a00 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
34a10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
34a20 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
34a30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
34a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34a50 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
34a60 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
34a70 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
34a80 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
34a90 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
34aa0 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
34ab0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
34ac0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
34ad0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
34ae0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
34af0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
34b00 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
34b10 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
34b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34b30 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28  unixCurrentTime(
34b40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34b50 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72  Used, double *pr
34b60 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Now){.  sqlite3_
34b70 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
34b80 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f  nt rc;.  UNUSED_
34b90 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34ba0 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43  d);.  rc = unixC
34bb0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
34bc0 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77  0, &i);.  *prNow
34bd0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
34be0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34bf0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
34c00 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 20 30  nixCurrentTime 0
34c10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
34c20 68 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  he xGetLastError
34c30 28 29 20 6d 65 74 68 6f 64 20 69 73 20 64 65 73  () method is des
34c40 69 67 6e 65 64 20 74 6f 20 72 65 74 75 72 6e 20  igned to return 
34c50 61 20 62 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d  a better.** low-
34c60 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73  level error mess
34c70 61 67 65 20 77 68 65 6e 20 6f 70 65 72 61 74 69  age when operati
34c80 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
34c90 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
34ca0 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
34cb0 61 74 69 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65  ation.  Only the
34cc0 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   integer return 
34cd0 63 6f 64 65 20 69 73 20 63 75 72 72 65 6e 74 6c  code is currentl
34ce0 79 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74  y.** used..*/.st
34cf0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
34d00 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
34d10 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
34d20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68  int NotUsed2, ch
34d30 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20  ar *NotUsed3){. 
34d40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34d50 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e  R(NotUsed);.  UN
34d60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
34d70 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53  otUsed2);.  UNUS
34d80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34d90 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e  Used3);.  return
34da0 20 65 72 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   errno;.}.../*.*
34db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34dc0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73  ******* End of s
34dd0 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
34de0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
34df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
34e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
34e50 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
34e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
34ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
34ec0 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a   Proxy Locking *
34ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
34ef0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b  **.** Proxy lock
34f00 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c  ing is a "uber-l
34f10 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69  ocking-method" i
34f20 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49  n this sense:  I
34f30 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74  t uses the.** ot
34f40 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  her locking meth
34f50 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79  ods on secondary
34f60 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72   lock files.  Pr
34f70 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
34f80 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f  .** meta-layer o
34f90 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70  ver top of the p
34fa0 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67  rimitive locking
34fb0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f   implemented abo
34fc0 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73  ve.  For.** this
34fd0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
34fe0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
34ff0 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c  ments of proxy l
35000 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ocking is deferr
35010 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65  ed.** until late
35020 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65   in the file (he
35030 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  re) after all of
35040 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d   the other I/O m
35050 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62  ethods have.** b
35060 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f  een defined - so
35070 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74   that the primit
35080 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ive locking meth
35090 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ods are availabl
350a0 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73  e.** as services
350b0 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68   to help with th
350c0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
350d0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
350e0 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  g..**.****.**.**
350f0 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   The default loc
35100 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20  king schemes in 
35110 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d  SQLite use byte-
35120 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  range locks on t
35130 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
35140 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  ile to coordinat
35150 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65  e safe, concurre
35160 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  nt access by mul
35170 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a  tiple readers.**
35180 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74   and writers [ht
35190 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
351a0 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e  lockingv3.html].
351b0 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20    The five file 
351c0 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65  locking.** state
351d0 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e  s (UNLOCKED, PEN
351e0 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45  DING, SHARED, RE
351f0 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56  SERVED, EXCLUSIV
35200 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  E) are implement
35210 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72  ed.** as POSIX r
35220 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b  ead & write lock
35230 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74  s over fixed set
35240 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76   of locations (v
35250 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e  ia fsctl),.** on
35260 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c   AFP and SMB onl
35270 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65  y exclusive byte
35280 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
35290 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66   available via f
352a0 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f  sctl.** with _IO
352b0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
352c0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
352d0 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68  PB2) to track th
352e0 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e  e same 5 states.
352f0 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20  .** To simulate 
35300 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65  a F_RDLCK on the
35310 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f   shared range, o
35320 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79  n AFP a randomly
35330 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64   selected.** add
35340 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72  ress in the shar
35350 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
35360 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c  n for a SHARED l
35370 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a  ock, the entire.
35380 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  ** shared range 
35390 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20  is taken for an 
353a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a  EXCLUSIVE lock):
353b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44  .**.**      PEND
353c0 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20  ING_BYTE        
353d0 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20  0x40000000.**   
353e0 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45     RESERVED_BYTE
353f0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
35400 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  1.**      SHARED
35410 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78  _RANGE        0x
35420 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30  40000002 -> 0x40
35430 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69  000200.**.** Thi
35440 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20  s works well on 
35450 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
35460 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73  ystem, but shows
35470 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a   a nearly 100x.*
35480 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65  * slowdown in re
35490 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ad performance o
354a0 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68  n AFP because th
354b0 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73  e AFP client dis
354c0 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61  ables.** the rea
354d0 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74  d cache when byt
354e0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
354f0 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62  e present.  Enab
35500 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a  ling the read.**
35510 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61   cache exposes a
35520 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
35530 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73   problem that is
35540 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20   present on all 
35550 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65  OS X.** supporte
35560 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73  d network file s
35570 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64  ystems.  NFS and
35580 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76   AFP both observ
35590 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74  e the.** close-t
355a0 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73  o-open semantics
355b0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61   for ensuring ca
355c0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a  che coherency.**
355d0 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75   [http://nfs.sou
355e0 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61  rceforge.net/#fa
355f0 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65  q_a8], which doe
35600 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c  s not effectivel
35610 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65  y.** address the
35620 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f   requirements fo
35630 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74  r concurrent dat
35640 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20  abase access by 
35650 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64  multiple.** read
35660 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
35670 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e  ** [http://www.n
35680 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65  abble.com/SQLite
35690 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f  -on-NFS-cache-co
356a0 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37  herency-td156557
356b0 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20  01.html]..**.** 
356c0 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70  To address the p
356d0 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63  erformance and c
356e0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69  ache coherency i
356f0 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c  ssues, proxy fil
35700 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61  e locking.** cha
35710 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74  nges the way dat
35720 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20  abase access is 
35730 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69  controlled by li
35740 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f  miting access to
35750 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73   a.** single hos
35760 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20  t at a time and 
35770 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  moving file lock
35780 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74  s off of the dat
35790 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  abase file.** an
357a0 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66  d onto a proxy f
357b0 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ile on the local
357c0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a   file system.  .
357d0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70  **.**.** Using p
357e0 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d  roxy locks.** --
357f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
35800 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a  **.** C APIs.**.
35810 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  **  sqlite3_file
35820 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e  _control(db, dbn
35830 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
35840 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
35850 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
35860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
35870 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
35880 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
35890 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
358a0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
358b0 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f  ITE_FCNTL_GET_LO
358c0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20  CKPROXYFILE,.** 
358d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358e0 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61        &<proxy_pa
358f0 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53  th>);.**.**.** S
35900 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a  QL pragmas.**.**
35910 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61    PRAGMA [databa
35920 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66  se.]lock_proxy_f
35930 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e  ile=<proxy_path>
35940 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52   | :auto:.**  PR
35950 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
35960 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a  lock_proxy_file.
35970 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67  **.** Specifying
35980 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20   ":auto:" means 
35990 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
359a0 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69   a conch file wi
359b0 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a  th a matching.**
359c0 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20   host ID in it, 
359d0 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69  the proxy path i
359e0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
359f0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f   will be used, o
35a00 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72  therwise.** a pr
35a10 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f  oxy path based o
35a20 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d  n the user's tem
35a30 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f  p dir.** (via co
35a40 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
35a50 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e  _USER_TEMP_DIR,.
35a60 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65  ..)) will be use
35a70 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74  d and the.** act
35a80 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e  ual proxy file n
35a90 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ame is generated
35aa0 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61   from the name a
35ab0 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a  nd path of the.*
35ac0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
35ad0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
35ae0 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64  *.**       For d
35af0 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55  atabase path "/U
35b00 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20  sers/me/foo.db" 
35b10 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f  .**       The lo
35b20 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
35b30 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65  "<tmpdir>/sqlite
35b40 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65  plocks/_Users_me
35b50 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a  _foo.db:auto:").
35b60 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63  **.** Once a loc
35b70 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69  k proxy is confi
35b80 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61  gured for a data
35b90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  base connection,
35ba0 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62   it can not.** b
35bb0 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76  e removed, howev
35bc0 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69  er it may be swi
35bd0 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65  tched to a diffe
35be0 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20  rent proxy path 
35bf0 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65  via.** the above
35c00 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20   APIs (assuming 
35c10 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  the conch file i
35c20 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64  s not being held
35c30 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63   by another.** c
35c40 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f  onnection or pro
35c50 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  cess). .**.**.**
35c60 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69   How proxy locki
35c70 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d  ng works.** ----
35c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c90 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ---.**.** Proxy 
35ca0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c  file locking rel
35cb0 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e  ies primarily on
35cc0 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74   two new support
35cd0 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a  ing files: .**.*
35ce0 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c  *   *  conch fil
35cf0 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73  e to limit acces
35d00 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
35d10 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67  e file to a sing
35d20 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20  le host.**      
35d30 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20  at a time.**.** 
35d40 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20    *  proxy file 
35d50 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78  to act as a prox
35d60 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f  y for the adviso
35d70 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c  ry locks normall
35d80 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20  y.**      taken 
35d90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
35da0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20  **.** The conch 
35db0 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20  file - to use a 
35dc0 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69  proxy file, sqli
35dd0 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68  te must first "h
35de0 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a  old the conch".*
35df0 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73  * by taking an s
35e00 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72  qlite-style shar
35e10 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63  ed lock on the c
35e20 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69  onch file, readi
35e30 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
35e40 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67  ts and comparing
35e50 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71   the host's uniq
35e60 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20  ue host ID (see 
35e70 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a  below) and lock.
35e80 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67  ** proxy path ag
35e90 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73  ainst the values
35ea0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
35eb0 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68  onch.  The conch
35ec0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72   file is.** stor
35ed0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
35ee0 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20  irectory as the 
35ef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
35f00 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a  d the file name.
35f10 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20  ** is patterned 
35f20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61  after the databa
35f30 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  se file name as 
35f40 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e  ".<databasename>
35f50 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74  -conch"..** If t
35f60 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f  he conch file do
35f70 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
35f80 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f   its contents do
35f90 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a   not match the.*
35fa0 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72  * host ID and/or
35fb0 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65   proxy path, the
35fc0 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73  n the lock is es
35fd0 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78  calated to an ex
35fe0 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20  clusive.** lock 
35ff0 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69  and the conch fi
36000 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75  le contents is u
36010 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
36020 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78  host ID and prox
36030 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68  y.** path and th
36040 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72  e lock is downgr
36050 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64  aded to a shared
36060 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66   lock again.  If
36070 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73   the conch.** is
36080 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
36090 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61   process (with a
360a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74   shared lock), t
360b0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
360c0 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61  k.** will fail a
360d0 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  nd SQLITE_BUSY i
360e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
360f0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
36100 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65   - a single-byte
36110 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61   file used for a
36120 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65  ll advisory file
36130 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c   locks.** normal
36140 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20  ly taken on the 
36150 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
36160 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72   This allows for
36170 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a   safe sharing.**
36180 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36190 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70   file for multip
361a0 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  le readers and w
361b0 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61  riters on the sa
361c0 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20  me.** host (the 
361d0 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68  conch ensures th
361e0 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20  at they all use 
361f0 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c  the same local l
36200 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a  ock file)..**.**
36210 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20   Requesting the 
36220 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20  lock proxy does 
36230 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  not immediately 
36240 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20  take the conch, 
36250 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61  it is.** only ta
36260 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72  ken when the fir
36270 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f  st request to lo
36280 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ck database file
36290 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54   is made.  .** T
362a0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
362b0 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65  semantics of the
362c0 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63   traditional loc
362d0 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77  king behavior, w
362e0 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  here.** opening 
362f0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
36300 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
36310 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20  does not take a 
36320 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54  lock on it..** T
36330 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61  he shared lock a
36340 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  nd an open file 
36350 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d  descriptor are m
36360 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20  aintained until 
36370 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  .** the connecti
36380 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
36390 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a  se is closed. .*
363a0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66  *.** The proxy f
363b0 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ile and the lock
363c0 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20   file are never 
363d0 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20  deleted so they 
363e0 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  only need.** to 
363f0 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66  be created the f
36400 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61  irst time they a
36410 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  re used..**.** C
36420 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
36430 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ions.** --------
36440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
36450 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46  .**  SQLITE_PREF
36460 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
36470 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74  .**.**       Dat
36480 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65  abase files acce
36490 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61  ssed on non-loca
364a0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61  l file systems a
364b0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f  re.**       auto
364c0 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67  matically config
364d0 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c  ured for proxy l
364e0 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c  ocking, lock fil
364f0 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
36500 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61  named automatica
36510 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61  lly using the sa
36520 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20  me logic as.**  
36530 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b       PRAGMA lock
36540 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75  _proxy_file=":au
36550 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  to:".**    .**  
36560 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42  SQLITE_PROXY_DEB
36570 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45  UG.**.**       E
36580 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69  nables the loggi
36590 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73  ng of error mess
365a0 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74  ages during host
365b0 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20   id file.**     
365c0 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20    retrieval and 
365d0 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  creation.**.**  
365e0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a  LOCKPROXYDIR.**.
365f0 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64  **       Overrid
36600 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64  es the default d
36610 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f  irectory used fo
36620 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c  r lock proxy fil
36630 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
36640 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d   are named autom
36650 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65  atically via the
36660 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e   ":auto:" settin
36670 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  g.**.**  SQLITE_
36680 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
36690 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a  _PERMISSIONS.**.
366a0 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73  **       Permiss
366b0 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e  ions to use when
366c0 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65   creating a dire
366d0 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e  ctory for storin
366e0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c  g the.**       l
366f0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c  ock proxy files,
36700 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
36710 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20  LOCKPROXYDIR is 
36720 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a  not set..**    .
36730 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e  **    .** As men
36740 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68  tioned above, wh
36750 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  en compiled with
36760 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
36770 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a  ROXY_LOCKING,.**
36780 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76   setting the env
36790 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
367a0 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  e SQLITE_FORCE_P
367b0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20  ROXY_LOCKING to 
367c0 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20  1 will.** force 
367d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
367e0 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65   be used for eve
367f0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
36800 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a   opened, and 0.*
36810 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74  * will force aut
36820 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63  omatic proxy loc
36830 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62  king to be disab
36840 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  led for all data
36850 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65  base.** files (e
36860 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e  xplicitly callin
36870 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  g the SQLITE_FCN
36880 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
36890 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
368a0 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
368b0 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
368c0 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
368d0 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
368e0 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
368f0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
36900 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
36910 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
36920 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
36930 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
36940 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
36950 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
36960 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
36970 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
36980 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
36990 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
369a0 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
369b0 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
369c0 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
369d0 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
369e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
369f0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
36a00 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
36a10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
36a20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
36a30 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
36a40 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
36a50 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
36a60 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
36a70 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
36a80 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
36a90 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
36aa0 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
36ab0 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
36ac0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
36ad0 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
36ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
36af0 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
36b00 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
36b10 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
36b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
36b30 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
36b40 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
36b50 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
36b60 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
36b70 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
36b80 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
36b90 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20  /.  int nFails; 
36ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
36bc0 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75  nch taking failu
36bd0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f  res */.  void *o
36be0 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ldLockingContext
36bf0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
36c00 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74  l lockingcontext
36c10 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63   to restore on c
36c20 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lose */.  sqlite
36c30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
36c40 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20  st *pOldMethod; 
36c50 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
36c60 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  I/O methods for 
36c70 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  close */.};../* 
36c80 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
36c90 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72  ck file path for
36ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
36cb0 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74   dbPath is writt
36cc0 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a  en into lPath, .
36cd0 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f  ** which must po
36ce0 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72  int to valid, wr
36cf0 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61  itable memory la
36d00 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
36d10 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a   maxLen length.*
36d20 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f  * file path. .*/
36d30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
36d40 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  yGetLockPath(con
36d50 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c  st char *dbPath,
36d60 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69   char *lPath, si
36d70 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20  ze_t maxLen){.  
36d80 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64  int len;.  int d
36d90 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  bLen;.  int i;..
36da0 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59  #ifdef LOCKPROXY
36db0 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  DIR.  len = strl
36dc0 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50  cpy(lPath, LOCKP
36dd0 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29  ROXYDIR, maxLen)
36de0 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20  ;.#else.# ifdef 
36df0 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f  _CS_DARWIN_USER_
36e00 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20  TEMP_DIR.  {.   
36e10 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43   if( !confstr(_C
36e20 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
36e30 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d  MP_DIR, lPath, m
36e40 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  axLen) ){.      
36e50 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43  OSTRACE(("GETLOC
36e60 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73  KPATH  failed %s
36e70 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64   errno=%d pid=%d
36e80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36e90 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f      lPath, errno
36ea0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
36eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
36ec0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
36ed0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
36ee0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
36ef0 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
36f00 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d  maxLen);    .  }
36f10 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
36f20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
36f30 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
36f40 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
36f50 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
36f60 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
36f70 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
36f80 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
36f90 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
36fa0 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
36fb0 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
36fc0 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
36fd0 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74   dbLen = (int)st
36fe0 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20  rlen(dbPath);.  
36ff0 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65  for( i=0; i<dbLe
37000 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28  n && (i+len+7)<(
37010 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29  int)maxLen; i++)
37020 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64  {.    char c = d
37030 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50  bPath[i];.    lP
37040 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d  ath[i+len] = (c=
37050 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d  ='/')?'_':c;.  }
37060 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d  .  lPath[i+len]=
37070 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
37080 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c  lPath, ":auto:",
37090 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52   maxLen);.  OSTR
370a0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
370b0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
370c0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
370d0 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64   lPath, osGetpid
370e0 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
370f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
37100 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
37110 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
37120 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
37130 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
37140 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
37150 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
37160 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
37170 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
37180 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
37190 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
371a0 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
371b0 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
371c0 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
371d0 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
371e0 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
371f0 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
37200 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
37210 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
37220 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
37230 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
37240 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
37250 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
37260 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
37270 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
37280 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
37290 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
372a0 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
372b0 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
372c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
372d0 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
372e0 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
372f0 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
37300 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
37310 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
37320 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
37330 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
37340 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
37350 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
37360 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
37370 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
37380 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
37390 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
373a0 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
373b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
373c0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
373d0 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
373e0 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
373f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
37400 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
37410 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
37420 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
37430 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
37440 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
37450 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
37460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37470 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
37480 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
37490 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
374a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
374b0 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20  n err;.         
374c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
374d0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
374e0 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =i+1;.    }.    
374f0 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[i] = lockPat
37500 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  h[i];.  }.  OSTR
37510 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b  ACE(("CREATELOCK
37520 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
37530 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
37540 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65  n",lockPath,osGe
37550 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74  tpid(0)));.  ret
37560 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
37570 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
37580 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37590 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
375a0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
375b0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
375c0 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
375d0 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
375e0 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
375f0 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
37600 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
37610 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
37620 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
37630 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
37640 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
37650 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
37660 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
37670 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
37680 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
37690 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
376a0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
376b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
376c0 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
376d0 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
376e0 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
376f0 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
37700 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
37710 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
37720 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
37730 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
37740 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
37750 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
37760 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
37770 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
37780 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
37790 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
377a0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
377b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
377c0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
377d0 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
377e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
377f0 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
37800 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
37810 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
37820 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
37830 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
37840 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
37850 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
37860 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
37870 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
37880 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
37890 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
378a0 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
378b0 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
378c0 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
378d0 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
378e0 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
378f0 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
37900 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
37910 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
37920 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
37930 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
37940 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
37950 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
37960 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
37970 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
37980 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
37990 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
379a0 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
379b0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
379c0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
379d0 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a  eof(*pUnused));.
379e0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
379f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
37a00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
37a10 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
37a20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
37a30 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
37a40 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
37a50 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
37a60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
37a70 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( fd<0 && errno=
37a80 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63  =ENOENT && isloc
37a90 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  kfile ){.      i
37aa0 66 28 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  f( proxyCreateLo
37ab0 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20  ckPath(path) == 
37ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37ad0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
37ae0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
37af0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
37b00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
37b10 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f  f( fd<0 ){.    o
37b20 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
37b30 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f  NLY;.    fd = ro
37b40 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
37b50 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
37b60 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
37b70 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c  o;.  }.  if( fd<
37b80 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 6c  0 ){.    if( isl
37b90 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
37ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37bb0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
37bc0 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29 20 7b  witch (terrno) {
37bd0 0a 20 20 20 20 20 20 63 61 73 65 20 45 41 43 43  .      case EACC
37be0 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ES:.        retu
37bf0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
37c00 20 20 20 20 20 20 63 61 73 65 20 45 49 4f 3a 20        case EIO: 
37c10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37c20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
37c30 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67  K; /* even thoug
37c40 68 20 69 74 20 69 73 20 74 68 65 20 63 6f 6e 63  h it is the conc
37c50 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66 61 75  h */.      defau
37c60 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  lt:.        retu
37c70 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
37c80 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
37c90 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 28   }.  .  pNew = (
37ca0 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c 69 74  unixFile *)sqlit
37cb0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
37cc0 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
37cd0 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
37ce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
37cf0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
37d00 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
37d10 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
37d20 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
37d30 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
37d40 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
37d50 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
37d60 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
37d70 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
37d80 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
37d90 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
37da0 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
37db0 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
37dc0 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
37dd0 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
37de0 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
37df0 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
37e00 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
37e10 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
37e20 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
37e30 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
37e40 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73  ixFile(&dummyVfs
37e50 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66  , fd, (sqlite3_f
37e60 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c  ile*)pNew, path,
37e70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
37e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37e90 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a  *ppFile = pNew;.
37ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37eb0 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72  E_OK;.  }.end_cr
37ec0 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a  eate_proxy:    .
37ed0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
37ee0 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  New, fd, __LINE_
37ef0 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  _);.  sqlite3_fr
37f00 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69  ee(pNew);.  sqli
37f10 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64  te3_free(pUnused
37f20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
37f30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
37f40 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74  _TEST./* simulat
37f50 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
37f60 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
37f70 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
37f80 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c  paths */.int sql
37f90 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
37fa0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65  = 0;.#endif..#de
37fb0 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49  fine PROXY_HOSTI
37fc0 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63  DLEN    16  /* c
37fd0 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69  onch file host i
37fe0 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 23 69 66  d length */..#if
37ff0 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54  def HAVE_GETHOST
38000 55 55 49 44 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61  UUID./* Not alwa
38010 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ys defined in th
38020 65 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20  e headers as it 
38030 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65  ought to be */.e
38040 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73  xtern int gethos
38050 74 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c  tuuid(uuid_t id,
38060 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69   const struct ti
38070 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 23  mespec *wait);.#
38080 65 6e 64 69 66 0a 0a 2f 2a 20 67 65 74 20 74 68  endif../* get th
38090 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65  e host ID via ge
380a0 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f  thostuuid(), pHo
380b0 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20  stID must point 
380c0 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  to PROXY_HOSTIDL
380d0 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20  EN .** bytes of 
380e0 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e  writable memory.
380f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
38100 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e  roxyGetHostID(un
38110 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f  signed char *pHo
38120 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f  stID, int *pErro
38130 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f  r){.  assert(PRO
38140 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20  XY_HOSTIDLEN == 
38150 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b  sizeof(uuid_t));
38160 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49  .  memset(pHostI
38170 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54  D, 0, PROXY_HOST
38180 49 44 4c 45 4e 29 3b 0a 23 69 66 64 65 66 20 48  IDLEN);.#ifdef H
38190 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a  AVE_GETHOSTUUID.
381a0 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74    {.    struct t
381b0 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20  imespec timeout 
381c0 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73  = {1, 0}; /* 1 s
381d0 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  ec timeout */.  
381e0 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69    if( gethostuui
381f0 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65  d(pHostID, &time
38200 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  out) ){.      in
38210 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  t err = errno;. 
38220 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20       if( pError 
38230 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72  ){.        *pErr
38240 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20  or = err;.      
38250 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
38260 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
38270 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
38280 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
38290 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a  pError);.#endif.
382a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
382b0 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65  ST.  /* simulate
382c0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
382d0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
382e0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
382f0 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71  aths */.  if( sq
38300 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
38310 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73   != 0){.    pHos
38320 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28  tID[0] = (char)(
38330 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68  pHostID[0] + (ch
38340 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74  ar)(sqlite3_host
38350 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b  id_num & 0xFF));
38360 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
38370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38380 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  K;.}../* The con
38390 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  ch file contains
383a0 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73   the header, hos
383b0 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69  t id and lock fi
383c0 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66  le path. */.#def
383d0 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56  ine PROXY_CONCHV
383e0 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d  ERSION 2   /* 1-
383f0 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d  byte header, 16-
38400 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61  byte host id, pa
38410 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
38420 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20  OXY_HEADERLEN   
38430 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   1   /* conch fi
38440 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68  le header length
38450 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
38460 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28  Y_PATHINDEX    (
38470 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
38480 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
38490 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d  .#define PROXY_M
384a0 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f  AXCONCHLEN  (PRO
384b0 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
384c0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58  XY_HOSTIDLEN+MAX
384d0 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a  PATHLEN)../* .**
384e0 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63   Takes an open c
384f0 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65  onch file, copie
38500 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74  s the contents t
38510 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64  o a new path and
38520 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20   then moves .** 
38530 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65  it back.  The ne
38540 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65  wly created file
38550 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  's file descript
38560 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74  or is assigned t
38570 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66  o the.** conch f
38580 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ile structure an
38590 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72  d finally the or
385a0 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c  iginal conch fil
385b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
385c0 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20