/ Hex Artifact Content
Login

Artifact e376adf6014df7d1a73faaaa6c87e6eb9b299b157a58cccff02fad8abc943fe7:


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 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b    u8 isUnlocked;
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219a0 54 72 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c  True if no DMS l
219b0 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68  ock held */.  ch
219c0 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
219d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
219e0 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
219f0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
21a00 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
21a30 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
21a40 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
21a50 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
21a60 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
21a70 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
21a80 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
21a90 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
21aa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21ab0 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21ad0 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
21ae0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
21af0 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
21b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21b10 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
21b20 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
21b30 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
21b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
21b50 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
21b60 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
21b70 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
21b80 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
21b90 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
21ba0 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
21bb0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
21bc0 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
21bd0 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
21be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
21bf0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
21c00 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
21c10 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
21c20 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
21c30 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
21c40 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
21c50 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
21c60 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
21c70 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
21c80 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
21c90 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
21ca0 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
21cb0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
21cc0 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
21cd0 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
21ce0 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
21cf0 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
21d00 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
21d10 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
21d20 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
21d30 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
21d40 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
21d50 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
21d60 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
21d70 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
21d80 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
21d90 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
21da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21db0 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
21dc0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
21dd0 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20  ex */.  u8 id;  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
21e00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
21e10 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
21e20 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  de */.  u16 shar
21e30 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
21e40 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
21e50 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
21e60 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
21e70 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
21e80 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
21e90 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
21ea0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
21eb0 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
21ec0 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
21ed0 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
21ee0 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
21ef0 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
21f00 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
21f10 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
21f20 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
21f30 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
21f40 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
21f50 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
21f60 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
21f70 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
21f80 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
21f90 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
21fa0 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
21fb0 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
21fc0 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
21fd0 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
21fe0 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
21ff0 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
22000 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
22010 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
22020 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
22030 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
22040 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
22050 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
22060 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69   WAL file */.  i
22070 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
22080 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
22090 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
220a0 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
220b0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
220c0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
220d0 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  of the locking r
220e0 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  ange */.  int n 
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22110 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29  tes to lock */.)
22120 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
22130 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70  *pShmNode; /* Ap
22140 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
22150 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
22160 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
22170 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
22180 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
22190 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
221a0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
221b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
221c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20  QLITE_OK;    /* 
221d0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
221e0 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f   fcntl() */..  /
221f0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
22200 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
22210 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
22220 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
22230 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  /.  pShmNode = p
22240 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
22250 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
22260 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22270 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
22280 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64  utex) || pShmNod
22290 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
222a0 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73   /* Shared locks
222b0 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65   never span more
222c0 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a   than one byte *
222d0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  /.  assert( n==1
222e0 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f   || lockType!=F_
222f0 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  RDLCK );..  /* L
22300 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20  ocks are within 
22310 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72  range */.  asser
22320 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51  t( n>=1 && n<=SQ
22330 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
22340 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
22350 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
22360 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
22370 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
22380 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
22390 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
223a0 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
223b0 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
223c0 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
223d0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
223e0 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
223f0 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
22400 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
22410 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
22420 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20  _SETLK, &f);.   
22430 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
22440 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
22450 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
22460 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
22470 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
22480 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
22490 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
224a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
224b0 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
224c0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
224d0 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
224e0 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
224f0 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
22500 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
22510 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22520 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
22530 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
22540 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
22550 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
22560 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
22570 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
22580 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
22590 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
225a0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
225b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
225c0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
225d0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
225e0 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
225f0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
22600 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
22610 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
22620 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22630 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
22640 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
22650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
22660 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
22670 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
22680 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
22690 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
226a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
226b0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
226c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
226d0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
226e0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
226f0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
22700 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
22710 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22720 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
22730 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
22740 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
22750 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
22760 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
22770 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
22780 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
22790 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
227a0 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
227b0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
227c0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
227d0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
227e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
227f0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
22800 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
22810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
22820 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
22830 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
22840 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
22850 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
22860 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
22870 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
22880 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
22890 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
228a0 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
228b0 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
228c0 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
228d0 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
228e0 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
228f0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
22900 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
22910 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
22920 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
22930 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
22940 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
22950 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
22960 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
22970 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
22980 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
22990 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
229a0 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
229b0 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
229c0 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
229d0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
229e0 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
229f0 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
22a00 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
22a10 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
22a20 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
22a30 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
22a40 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
22a50 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
22a60 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
22a70 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
22a80 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
22a90 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
22aa0 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
22ab0 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
22ac0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
22ad0 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
22ae0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
22af0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
22b00 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
22b10 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
22b20 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
22b30 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
22b40 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
22b50 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
22b60 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
22b70 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
22b80 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
22b90 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
22ba0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
22bb0 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
22bc0 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
22bd0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
22be0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
22bf0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
22c00 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
22c10 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
22c20 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20  p->nRef==0) ){. 
22c30 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61     int nShmPerMa
22c40 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  p = unixShmRegio
22c50 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69  nPerMap();.    i
22c60 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
22c70 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64  ( p->pInode==pFd
22c80 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ->pInode );.    
22c90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
22ca0 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
22cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
22cc0 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d  nRegion; i+=nShm
22cd0 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69  PerMap){.      i
22ce0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
22cf0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
22d00 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70  ->apRegion[i], p
22d10 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->szRegion);.   
22d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22d30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22d40 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a  ->apRegion[i]);.
22d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22d60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22d70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20  ->apRegion);.   
22d80 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
22d90 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
22da0 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f  se(pFd, p->h, __
22db0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70  LINE__);.      p
22dc0 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ->h = -1;.    }.
22dd0 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70      p->pInode->p
22de0 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ShmNode = 0;.   
22df0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
22e00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
22e10 68 65 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20  he DMS lock has 
22e20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b  not yet been tak
22e30 65 6e 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70  en on shm file p
22e40 53 68 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74  ShmNode. Attempt
22e50 20 74 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e   to.** take it n
22e60 6f 77 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ow. Return SQLIT
22e70 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
22e80 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
22e90 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
22ea0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
22eb0 49 66 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f  If the DMS canno
22ec0 74 20 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61  t be locked beca
22ed0 75 73 65 20 74 68 69 73 20 69 73 20 61 20 72 65  use this is a re
22ee0 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a  adonly_shm=1 .**
22ef0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
22f00 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
22f10 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
22f20 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a   lock, return.**
22f30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
22f40 5f 43 41 4e 54 4c 4f 43 4b 20 61 6e 64 20 73 65  _CANTLOCK and se
22f50 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e  t pShmNode->isUn
22f60 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61  locked=1..*/.sta
22f70 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
22f80 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
22f90 78 46 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e  xFile *pDbFd, un
22fa0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
22fb0 6f 64 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66  ode){.  struct f
22fc0 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
22fd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22fe0 0a 0a 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54  ..  /* Use F_GET
22ff0 4c 4b 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  LK to determine 
23000 74 68 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20  the locks other 
23010 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f  processes are ho
23020 6c 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68  lding.  ** on th
23030 65 20 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69  e DMS byte. If i
23040 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
23050 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
23060 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a   is holding.  **
23070 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
23080 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73  then this proces
23090 73 20 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20  s may also take 
230a0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
230b0 2a 2a 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ** and proceed w
230c0 69 74 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ith opening the 
230d0 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a  *-shm file. .  *
230e0 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f  *.  ** Or, if no
230f0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
23100 73 20 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f  s holding any lo
23110 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72  ck, then this pr
23120 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68  ocess.  ** is th
23130 65 20 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20  e first to open 
23140 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
23150 20 74 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49   take an EXCLUSI
23160 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
23170 20 2a 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64   ** DMS byte and
23180 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d   truncate the *-
23190 73 68 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  shm file to zero
231a0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
231b0 54 68 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72  Then.  ** downgr
231c0 61 64 65 20 74 6f 20 61 20 53 48 41 52 45 44 20  ade to a SHARED 
231d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20  lock on the DMS 
231e0 62 79 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  byte..  **.  ** 
231f0 49 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  If another proce
23200 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  ss is holding an
23210 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
23220 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c  on the DMS byte,
23230 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
23240 49 54 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20  ITE_BUSY to the 
23250 63 61 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20  caller (it will 
23260 74 72 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65  try again). An e
23270 61 72 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73  arlier.  ** vers
23280 69 6f 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65  ion of this code
23290 20 61 74 74 65 6d 70 74 65 64 20 74 68 65 20 53   attempted the S
232a0 48 41 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68  HARED lock at th
232b0 69 73 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20  is point. But.  
232c0 2a 2a 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63  ** this introduc
232d0 65 64 20 61 20 73 75 62 74 6c 65 20 72 61 63 65  ed a subtle race
232e0 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74   condition: if t
232f0 68 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69  he process holdi
23300 6e 67 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  ng.  ** EXCLUSIV
23310 45 20 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65  E failed just be
23320 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20  fore truncating 
23330 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20  the *-shm file, 
23340 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70  then this.  ** p
23350 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
23360 6e 20 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d  n and use the *-
23370 73 68 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74  shm file without
23380 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
23390 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
233a0 2a 2d 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62  *-shm file has b
233b0 65 65 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79  een corrupted by
233c0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
233d0 20 6f 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20   or.  ** system 
233e0 63 72 61 73 68 2c 20 74 68 65 20 64 61 74 61 62  crash, the datab
233f0 61 73 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61  ase itself may a
23400 6c 73 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  lso become corru
23410 70 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  pt.  */.  lock.l
23420 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
23430 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ET;.  lock.l_sta
23440 72 74 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  rt = UNIX_SHM_DM
23450 53 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  S;.  lock.l_len 
23460 3d 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79  = 1;.  lock.l_ty
23470 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
23480 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  if( osFcntl(pShm
23490 4e 6f 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  Node->h, F_GETLK
234a0 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a  , &lock)!=0 ) {.
234b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
234c0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65  IOERR_LOCK;.  }e
234d0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
234e0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
234f0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
23500 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ->isReadonly ){.
23510 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
23520 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a  isUnlocked = 1;.
23530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23540 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c  E_READONLY_CANTL
23550 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
23560 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
23570 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
23580 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49  Fd, F_WRLCK, UNI
23590 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
235a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
235b0 49 54 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74  ITE_OK && robust
235c0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
235d0 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
235e0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
235f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
23600 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74  OERR_SHMOPEN,"ft
23610 72 75 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64  runcate",pShmNod
23620 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
23630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23640 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
23650 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b  type==F_WRLCK ){
23660 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
23670 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66  _BUSY;.  }..  if
23680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23690 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  ){.    assert( l
236a0 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e  ock.l_type==F_UN
236b0 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79  LCK || lock.l_ty
236c0 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20  pe==F_RDLCK );. 
236d0 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
236e0 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
236f0 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_RDLCK, UNIX_S
23700 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a  HM_DMS, 1);.  }.
23710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23720 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61  /*.** Open a sha
23730 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
23740 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23750 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
23760 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54  le pDbFd.  .** T
23770 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 69  his particular i
23780 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
23790 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73  es mmapped files
237a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ..**.** The file
237b0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
237c0 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  nt shared-memory
237d0 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20   is in the same 
237e0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20  directory.** as 
237f0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
23800 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74  e file and has t
23810 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
23820 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
23830 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74  e.** file with t
23840 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78  he "-shm" suffix
23850 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61   added.  For exa
23860 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74  mple, if the dat
23870 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73  abase file.** is
23880 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f   "/home/user1/co
23890 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68  nfig.db" then th
238a0 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 63  e file that is c
238b0 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70  reated and mmapp
238c0 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64  ed.** for shared
238d0 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
238e0 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73  called "/home/us
238f0 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68  er1/config.db-sh
23900 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74  m".  .**.** Anot
23910 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20  her approach to 
23920 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20  is to use files 
23930 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f  in /dev/shm or /
23940 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a  dev/tmp or an.**
23950 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66   some other tmpf
23960 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20  s mount. But if 
23970 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66  a file in a diff
23980 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a  erent directory.
23990 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ** from the data
239a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73 65  base file is use
239b0 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e  d, then differin
239c0 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  g access permiss
239d0 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72  ions.** or a chr
239e0 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75 73  oot() might caus
239f0 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20  e two different 
23a00 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65  processes on the
23a10 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73   same.** databas
23a20 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e  e to end up usin
23a30 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  g different file
23a40 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  s for shared mem
23a50 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e  ory - .** meanin
23a60 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d  g that their mem
23a70 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65  ory would not re
23a80 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d  ally be shared -
23a90 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e   resulting.** in
23aa0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
23ab0 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c  tion.  Neverthel
23ac0 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20  ess, this tmpfs 
23ad0 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61  file usage.** ca
23ae0 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20  n be enabled at 
23af0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69  compile-time usi
23b00 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f  ng -DSQLITE_SHM_
23b10 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f  DIRECTORY="/dev/
23b20 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65  shm".** or the e
23b30 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20  quivalent.  The 
23b40 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  use of the SQLIT
23b50 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
23b60 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
23b70 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69  option results i
23b80 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
23b90 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74  e build of SQLit
23ba0 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51  e;  builds of SQ
23bb0 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74  Lite.** that wit
23bc0 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49  h differing SQLI
23bd0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23be0 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70   settings attemp
23bf0 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  t to use the.** 
23c00 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
23c10 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
23c20 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f  ime, database co
23c30 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69  rruption will li
23c40 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20  kely.** result. 
23c50 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  The SQLITE_SHM_D
23c60 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
23c70 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
23c80 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75  considered.** "u
23c90 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20  nsupported" and 
23ca0 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61  may go away in a
23cb0 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20 72   future SQLite r
23cc0 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  elease..**.** Wh
23cd0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
23ce0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
23cf0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
23d00 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
23d10 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
23d20 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
23d30 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
23d40 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
23d50 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
23d60 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
23d70 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
23d80 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
23d90 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
23da0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23db0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
23dc0 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29 20  se file (pDbFd) 
23dd0 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e  is using the "un
23de0 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20  ix-excl" VFS.** 
23df0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
23e00 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23e10 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
23e20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
23e30 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74  nd.** that no ot
23e40 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72  her processes ar
23e50 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f  e able to read o
23e60 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61  r write the data
23e70 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61  base.  In.** tha
23e80 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f  t case, we do no
23e90 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68  t really need sh
23ea0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f  ared memory.  No
23eb0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a   shared memory.*
23ec0 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  * file is create
23ed0 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20 6d  d.  The shared m
23ee0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69  emory will be si
23ef0 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65 61  mulated with hea
23f00 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  p memory..*/.sta
23f10 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
23f20 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69  SharedMemory(uni
23f30 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  xFile *pDbFd){. 
23f40 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20   struct unixShm 
23f50 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
23f60 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
23f70 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
23f80 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
23f90 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
23fa0 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e;   /* The unde
23fb0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
23fc0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ile */.  int rc 
23fd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
23fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
23ff0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
24000 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
24010 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
24020 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20  The inode of fd 
24030 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46  */.  char *zShmF
24040 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
24050 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24060 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  the file used fo
24070 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e  r SHM */.  int n
24080 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
24090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
240a0 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69  ze of the SHM fi
240b0 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  lename in bytes 
240c0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
240d0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
240e0 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  new unixShm obje
240f0 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ct. */.  p = sql
24100 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
24110 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
24120 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
24130 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24140 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  PT;.  memset(p, 
24150 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
24160 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
24170 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
24180 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
24190 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
241a0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
241b0 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
241c0 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
241d0 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
241e0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
241f0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
24200 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
24210 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
24220 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
24230 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
24240 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
24250 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
24260 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
24270 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
24280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
24290 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
242a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
242b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
242c0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
242d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
242e0 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e  sePath = pDbFd->
242f0 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  zPath;.#endif.. 
24300 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
24310 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
24320 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
24330 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24340 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
24350 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
24360 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
24370 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
24380 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
24390 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
243a0 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
243b0 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
243c0 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
243d0 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  d->h, &sStat) ){
243e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
243f0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
24400 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
24410 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
24420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
24430 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
24440 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nShmFilename = s
24450 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d  izeof(SQLITE_SHM
24460 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31  _DIRECTORY) + 31
24470 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d  ;.#else.    nShm
24480 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28  Filename = 6 + (
24490 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65  int)strlen(zBase
244a0 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
244b0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
244c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
244d0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
244e0 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20   + nShmFilename 
244f0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
24500 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
24510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24520 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
24530 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
24540 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
24550 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
24560 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
24570 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
24580 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
24590 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
245a0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
245b0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
245c0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
245d0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
245e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
245f0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
24600 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
24630 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
24640 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24660 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
24670 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
24680 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
24690 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
246a0 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
246b0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
246c0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
246d0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
246e0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
246f0 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
24700 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
24710 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
24720 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
24730 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
24740 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
24750 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
24760 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
24770 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
24780 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
24790 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
247a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
247b0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
247c0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
247d0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
247e0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
247f0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
24800 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24810 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
24820 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
24830 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  en_err;.      }.
24840 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
24850 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
24860 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
24870 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
24880 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
24890 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
248a0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
248b0 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
248c0 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
248d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   ){.        open
248e0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
248f0 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  ;.        pShmNo
24900 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
24910 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
24920 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
24930 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
24940 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c  Filename, openFl
24950 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d  ags, (sStat.st_m
24960 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
24970 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
24980 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  h<0 ){.        r
24990 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
249a0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
249b0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
249c0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
249d0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
249e0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
249f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
24a00 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
24a10 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
24a20 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
24a30 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
24a40 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
24a50 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
24a60 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
24a70 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
24a80 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
24a90 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
24aa0 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
24ab0 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
24ac0 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
24ad0 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
24ae0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
24af0 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
24b00 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20 20 20  .st_gid);..     
24b10 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68   rc = unixLockSh
24b20 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
24b30 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  , pShmNode);.   
24b40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24b50 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
24b60 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
24b70 4c 4f 43 4b 20 29 20 67 6f 74 6f 20 73 68 6d 5f  LOCK ) goto shm_
24b80 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
24b90 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
24ba0 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
24bb0 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
24bc0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
24bd0 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
24be0 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
24bf0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
24c00 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
24c10 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
24c20 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
24c30 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
24c40 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
24c50 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
24c60 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
24c70 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
24c80 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
24c90 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
24ca0 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
24cb0 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
24cc0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
24cd0 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
24ce0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
24cf0 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
24d00 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
24d10 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
24d20 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
24d30 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
24d40 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
24d50 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
24d60 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
24d70 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
24d80 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
24d90 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
24da0 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
24db0 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
24dc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
24dd0 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
24de0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
24df0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
24e00 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
24e10 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
24e20 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
24e30 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
24e40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
24e50 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
24e60 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
24e70 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
24e80 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
24e90 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
24ea0 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75  err:.  unixShmPu
24eb0 72 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20  rge(pDbFd);     
24ec0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
24ed0 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
24ee0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
24ef0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
24f00 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
24f10 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
24f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24f30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24f40 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
24f50 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
24f60 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
24f70 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
24f80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
24f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24fa0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
24fb0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
24fc0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
24fd0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
24fe0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
24ff0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
25000 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
25010 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
25020 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25030 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
25040 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
25050 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
25060 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
25070 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62  erwise, if the b
25080 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72  Extend parameter
25090 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
250a0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
250b0 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
250c0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
250d0 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
250e0 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
250f0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
25100 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
25110 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
25120 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
25130 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
25140 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62  turned. If .** b
25150 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65  Extend is non-ze
25160 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
25170 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
25180 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
25190 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
251a0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
251b0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
251c0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
251d0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
251e0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
251f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
25200 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
25210 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
25220 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
25230 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
25240 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
25250 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
25260 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
25270 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
25280 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
25290 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
252a0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
252b0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
252c0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
252d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
252e0 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71  unixShmMap(.  sq
252f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25310 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
25320 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25330 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
25340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25350 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
25360 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
25370 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25390 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
253a0 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e   */.  int bExten
253b0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
253c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
253d0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
253e0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
253f0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
25400 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
25410 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
25420 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  mory */.){.  uni
25430 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
25440 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
25450 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e  unixShm *p;.  un
25460 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25470 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
25480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
25490 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
254a0 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
254b0 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52  p();.  int nReqR
254c0 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  egion;..  /* If 
254d0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
254e0 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  y file has not y
254f0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
25500 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
25510 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68    if( pDbFd->pSh
25520 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  m==0 ){.    rc =
25530 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
25540 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
25550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25560 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25570 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46  .  }..  p = pDbF
25580 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e  d->pShm;.  pShmN
25590 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
255a0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
255b0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
255c0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
255d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c   pShmNode->isUnl
255e0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72 63 20  ocked ){.    rc 
255f0 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
25600 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
25610 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  hmNode);.    if(
25620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25630 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
25640 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  t;.    pShmNode-
25650 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  >isUnlocked = 0;
25660 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
25670 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
25680 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
25690 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
256a0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
256b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
256c0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
256d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
256e0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
256f0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
25700 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
25710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25720 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
25730 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
25740 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
25750 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
25760 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
25770 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
25780 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
25790 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
257a0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
257b0 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
257c0 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
257d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
257e0 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
257f0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
25800 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
25810 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
25820 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
25830 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
25840 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
25850 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
25860 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
25870 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
25880 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
25890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
258a0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
258b0 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
258c0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
258d0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
258e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
258f0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
25900 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
25910 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
25920 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
25930 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
25940 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
25950 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
25960 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
25970 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
25980 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
25990 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
259a0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
259b0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
259c0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
259d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
259e0 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
259f0 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
25a00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25a10 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
25a20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
25a30 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
25a40 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
25a50 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
25a60 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
25a70 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
25a80 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
25a90 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
25aa0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
25ab0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
25ac0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
25ad0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
25ae0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
25af0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
25b00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25b10 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
25b20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
25b30 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
25b40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
25b50 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
25b60 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
25b70 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
25b80 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
25b90 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
25ba0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
25bb0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
25bc0 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
25bd0 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
25be0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
25bf0 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
25c00 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
25c10 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
25c20 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
25c30 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
25c40 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
25c50 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
25c60 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
25c70 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
25c80 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
25c90 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
25ca0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
25cb0 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
25cc0 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
25cd0 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
25ce0 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
25cf0 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
25d00 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
25d10 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
25d20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
25d30 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
25d40 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
25d50 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
25d60 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
25d70 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
25d80 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
25d90 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
25da0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
25db0 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
25dc0 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
25dd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
25de0 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
25df0 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
25e00 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
25e10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
25e20 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
25e30 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
25e40 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
25e50 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
25e60 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
25e70 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
25e80 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
25e90 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
25ea0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
25ec0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
25ed0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
25ee0 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
25ef0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
25f00 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
25f10 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
25f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25f30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25f40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25f50 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
25f60 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
25f70 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
25f80 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
25f90 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
25fa0 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
25fb0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
25fc0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
25fd0 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
25fe0 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
25ff0 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
26000 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
26010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
26020 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
26030 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26040 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
26050 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
26060 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
26070 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
26080 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
26090 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
260a0 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
260b0 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
260c0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
260d0 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
260e0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
260f0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
26100 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
26110 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20  0, nMap,.       
26120 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
26130 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
26140 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
26150 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
26160 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
26170 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
26180 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
26190 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
261a0 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
261b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
261c0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
261d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
261e0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
261f0 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
26200 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
26210 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
26220 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
26230 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
26240 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
26250 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
26260 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
26270 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
26280 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
26290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
262a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
262b0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
262c0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
262d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
262e0 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
262f0 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
26300 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
26310 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
26320 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
26330 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
26340 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
26350 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
26360 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
26370 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
26380 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
26390 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
263a0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
263b0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
263c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
263d0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
263e0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
263f0 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
26400 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
26410 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
26420 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
26430 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
26440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
26460 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
26470 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
26480 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
26490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
264a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
264b0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
264c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
264d0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
264e0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
264f0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
26500 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
26510 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
26520 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
26530 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
26540 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
26550 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
26560 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
26570 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
26580 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
26590 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
265a0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
265b0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
265c0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
265d0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
265e0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
265f0 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
26600 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
26610 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
26620 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
26630 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
26640 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
26650 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
26660 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
26690 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
266a0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
266d0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
266e0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
266f0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26710 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
26720 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
26730 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
26740 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
26750 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
26760 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
26770 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
26780 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
26790 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
267a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
267b0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
267c0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
267d0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
26800 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
26810 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
26820 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
26830 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
26840 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
26850 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
26860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26870 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26880 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
26890 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
268a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
268d0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
268e0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
268f0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
26900 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
26910 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
26920 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
26930 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
26940 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
26950 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
26960 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
26970 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
26980 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
26990 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
269a0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
269b0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
269c0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
269d0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
269e0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
269f0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
26a00 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
26a10 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
26a20 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
26a30 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
26a40 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
26a50 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
26a60 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
26a70 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
26a80 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
26a90 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
26aa0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
26ab0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
26ac0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
26ad0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
26ae0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
26af0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
26b00 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
26b10 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
26b20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
26b30 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
26b40 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
26b50 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
26b60 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
26b70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
26b80 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
26b90 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
26ba0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
26bb0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
26bc0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
26bd0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
26be0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
26bf0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
26c00 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
26c10 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
26c20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
26c30 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
26c40 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
26c50 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
26c60 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
26c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
26c80 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
26c90 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
26ca0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
26cb0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
26cc0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
26cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
26ce0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
26cf0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
26d00 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
26d10 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
26d20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
26d30 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
26d40 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
26d50 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
26d60 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
26d70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26d80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
26d90 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
26da0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
26db0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26dc0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
26dd0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
26de0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
26df0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
26e00 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
26e10 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
26e20 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
26e30 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
26e40 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
26e50 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
26e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
26e70 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
26e80 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
26e90 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
26ea0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
26eb0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
26ec0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
26ed0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
26ee0 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
26ef0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
26f00 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
26f10 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
26f20 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
26f30 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
26f40 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
26f50 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
26f60 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
26f70 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
26f80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
26fa0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
26fc0 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
26fd0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
26fe0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
26ff0 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
27000 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
27010 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
27020 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
27040 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
27050 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
27060 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
27070 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
27080 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
27090 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
270a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
270b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
270c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
270d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
270e0 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
270f0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
27100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27110 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
27120 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
27130 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
27140 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
27150 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
27160 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
27170 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
27180 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
27190 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
271a0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
271b0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
271c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
271d0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
271e0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
271f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
27200 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
27210 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
27220 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
27230 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
27240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27250 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
27260 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
27270 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
27280 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
27290 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
272a0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
272b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
272c0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
272d0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
272e0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
272f0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
27300 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27310 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
27320 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
27330 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
27340 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
27350 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
27360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27380 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
27390 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
273a0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
273b0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
273c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
273d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
273e0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
273f0 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
27400 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
27410 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
27420 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
27430 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
27440 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
27450 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
27460 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
27470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27480 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
27490 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
274a0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
274b0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
274c0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
274d0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
274e0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
274f0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
27500 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
27510 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
27520 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
27530 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
27540 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
27550 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
27560 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
27570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
27580 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
27590 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
275a0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
275b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
275c0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
275d0 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
275e0 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
275f0 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
27600 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e   barrier */.  un
27610 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27630 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72   Also mutex, for
27640 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20   redundancy */. 
27650 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
27660 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
27670 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
27680 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
27690 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
276a0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
276b0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
276c0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
276d0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
276e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
276f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
27700 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
27710 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
27720 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
27730 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
27740 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
27750 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
27760 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
27770 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
27780 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
27790 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
277a0 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
277b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
277c0 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
277d0 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
277e0 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
27810 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
27820 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
27830 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
27840 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
27850 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
27860 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
27870 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
278a0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
278b0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
278c0 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278e0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
278f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
27900 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
27910 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
27920 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
27930 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
27940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
27950 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
27960 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
27970 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
27980 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
27990 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
279a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
279b0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
279c0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
279d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
279e0 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
279f0 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
27a00 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
27a10 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
27a20 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
27a30 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
27a40 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
27a50 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
27a60 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
27a70 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
27a80 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
27a90 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
27aa0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
27ab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
27ac0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
27ad0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
27ae0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
27af0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
27b00 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
27b10 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
27b20 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
27b30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
27b40 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
27b50 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
27b60 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
27b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
27b80 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
27b90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
27ba0 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
27bb0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
27bc0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
27bd0 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
27be0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  >=0 ){.      osU
27bf0 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e  nlink(pShmNode->
27c00 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
27c10 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  }.    unixShmPur
27c20 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
27c30 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
27c40 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
27c50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
27c60 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
27c70 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
27c80 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
27c90 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
27ca0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
27cb0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
27cc0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
27cd0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
27ce0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
27cf0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
27d00 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
27d10 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
27d20 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
27d30 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
27d40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
27d50 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
27d60 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
27d70 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
27d80 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
27d90 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
27da0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75  gion ){.    osMu
27db0 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
27dc0 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53  gion, pFd->mmapS
27dd0 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20  izeActual);.    
27de0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
27df0 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
27e00 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
27e10 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
27e20 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ual = 0;.  }.}..
27e30 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
27e40 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
27e50 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
27e60 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
27e70 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
27e80 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
27e90 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
27ea0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
27eb0 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
27ec0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27ed0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
27ee0 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
27ef0 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
27f00 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
27f10 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
27f20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
27f30 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
27f40 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
27f50 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
27f60 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
27f70 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
27f80 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
27f90 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
27fa0 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
27fb0 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
27fc0 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
27fd0 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
27fe0 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
27ff0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
28000 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
28010 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
28020 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
28030 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
28040 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
28050 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
28060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28070 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
28080 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
28090 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
280c0 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
280d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
280e0 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
280f0 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
28120 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
28130 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
28140 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
28150 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
28160 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
28170 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
28180 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
28190 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
281a0 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
281b0 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
281c0 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
281d0 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
281e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
281f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
28200 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
28210 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
28220 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28240 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
28250 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
28260 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
28270 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
28280 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
28290 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
282a0 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
282b0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
282c0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
282d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
282e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
282f0 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
28300 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
28310 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
28320 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
28330 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20  MAP_READWRITE.  
28340 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
28350 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
28360 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67  DONLY)==0 ) flag
28370 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b  s |= PROT_WRITE;
28380 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
28390 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45  Orig ){.#if HAVE
283a0 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20  _MREMAP.    i64 
283b0 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d  nReuse = pFd->mm
283c0 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  apSize;.#else.  
283d0 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79    const int szSy
283e0 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67  spage = osGetpag
283f0 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34  esize();.    i64
28400 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e   nReuse = (pFd->
28410 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53  mmapSize & ~(szS
28420 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64  yspage-1));.#end
28430 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20  if.    u8 *pReq 
28440 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d  = &pOrig[nReuse]
28450 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20  ;..    /* Unmap 
28460 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65  any pages of the
28470 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
28480 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65  g that cannot be
28490 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20   reused. */.    
284a0 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69  if( nReuse!=nOri
284b0 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  g ){.      osMun
284c0 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d  map(pReq, nOrig-
284d0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  nReuse);.    }..
284e0 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
284f0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65      pNew = osMre
28500 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
28510 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f  e, nNew, MREMAP_
28520 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45  MAYMOVE);.    zE
28530 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23  rr = "mremap";.#
28540 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
28550 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65  osMmap(pReq, nNe
28560 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c  w-nReuse, flags,
28570 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
28580 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28  nReuse);.    if(
28590 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45   pNew!=MAP_FAILE
285a0 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
285b0 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20  New!=pReq ){.   
285c0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e       osMunmap(pN
285d0 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73  ew, nNew - nReus
285e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
285f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
28600 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  e{.        pNew 
28610 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d  = pOrig;.      }
28620 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
28630 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70     /* The attemp
28640 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  t to extend the 
28650 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
28660 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74   failed. Free it
28670 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65  . */.    if( pNe
28680 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c  w==MAP_FAILED ||
28690 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
286a0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67    osMunmap(pOrig
286b0 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  , nReuse);.    }
286c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e  .  }..  /* If pN
286d0 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  ew is still NULL
286e0 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  , try to create 
286f0 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20  an entirely new 
28700 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
28710 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
28720 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30   pNew = osMmap(0
28730 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d  , nNew, flags, M
28740 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29  AP_SHARED, h, 0)
28750 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  ;.  }..  if( pNe
28760 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w==MAP_FAILED ){
28770 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
28780 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20     nNew = 0;.   
28790 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
287a0 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70  LITE_OK, zErr, p
287b0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20  Fd->zPath);..   
287c0 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28   /* If the mmap(
287d0 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20  ) above failed, 
287e0 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20  assume that all 
287f0 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28  subsequent mmap(
28800 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77  ) calls.    ** w
28810 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69  ill probably fai
28820 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b  l too. Fall back
28830 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f   to using xRead/
28840 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65  xWrite exclusive
28850 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  ly.    ** in thi
28860 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
28870 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
28880 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d   = 0;.  }.  pFd-
28890 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76  >pMapRegion = (v
288a0 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46  oid *)pNew;.  pF
288b0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46  d->mmapSize = pF
288c0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
288d0 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  l = nNew;.}../*.
288e0 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72  ** Memory map or
288f0 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20   remap the file 
28900 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64  opened by file-d
28910 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69  escriptor pFd (i
28920 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73  f the file.** is
28930 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c   already mapped,
28940 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
28950 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65  pping is replace
28960 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f  d by the new). O
28970 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  r, if .** there 
28980 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
28990 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
289a0 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
289b0 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20  e are still .** 
289c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
289d0 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
289e0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
289f0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
28a00 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
28a10 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
28a20 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
28a30 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
28a40 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20  ted size of .** 
28a50 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63  the mapping to c
28a60 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  reate. Otherwise
28a70 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65  , if nByte is le
28a80 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
28a90 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  en the .** reque
28aa0 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
28ab0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
28ac0 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
28ad0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
28ae0 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
28af0 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
28b00 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
28b10 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
28b20 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73  onfigured .** us
28b30 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
28b40 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69  _MMAP_LIMIT, whi
28b50 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
28b60 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
28b70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
28b80 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
28b90 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
28ba0 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
28bb0 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
28bc0 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
28bd0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
28be0 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
28bf0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
28c00 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
28c10 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
28c20 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
28c30 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73   i64 nMap){.  as
28c40 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
28c50 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
28c60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28c70 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e  nMap>0 || (pFd->
28c80 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70  mmapSize==0 && p
28c90 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
28ca0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d  0) );.  if( pFd-
28cb0 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
28cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28cd0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
28ce0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
28cf0 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
28d00 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c      /* Low-level
28d10 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
28d20 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46  n */.    if( osF
28d30 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
28d40 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20  atbuf) ){.      
28d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28d60 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
28d70 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74  .    nMap = stat
28d80 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d  buf.st_size;.  }
28d90 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
28da0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
28db0 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
28dc0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
28dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
28de0 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
28df0 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
28e00 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
28e10 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  ;.  if( nMap!=pF
28e20 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
28e30 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65     unixRemapfile
28e40 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d  (pFd, nMap);.  }
28e50 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
28e60 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
28e70 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
28e80 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
28e90 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
28ea0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
28eb0 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
28ec0 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
28ed0 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
28ee0 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
28ef0 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
28f00 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
28f10 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
28f20 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
28f30 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
28f40 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
28f50 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
28f60 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
28f70 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
28f80 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
28f90 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
28fa0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
28fb0 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
28fc0 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
28fd0 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
28fe0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
28ff0 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
29000 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
29010 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
29020 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
29030 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
29040 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
29050 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
29060 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
29070 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  ly .** release t
29080 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
29090 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65  calling unixUnfe
290a0 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tch()..*/.static
290b0 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73   int unixFetch(s
290c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
290d0 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e   i64 iOff, int n
290e0 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  Amt, void **pp){
290f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
29100 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
29110 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
29120 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
29130 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
29140 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
29150 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20  */.#endif.  *pp 
29160 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  = 0;..#if SQLITE
29170 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
29180 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
29190 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
291a0 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
291b0 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
291c0 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61   int rc = unixMa
291d0 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a  pfile(pFd, -1);.
291e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
291f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29200 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
29210 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
29220 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
29230 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
29240 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
29250 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
29260 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
29270 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
29280 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
29290 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
292a0 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
292b0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
292c0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
292d0 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65  function release
292e0 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  s a .** referenc
292f0 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e  e obtained by an
29300 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
29310 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68   unixFetch(). Th
29320 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
29330 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
29340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
29350 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
29360 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
29370 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  ng.** argument t
29380 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74  hat was passed t
29390 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68 28  o the unixFetch(
293a0 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a  ) invocation. .*
293b0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
293c0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
293d0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
293e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
293f0 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74  ing called .** t
29400 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53  o inform the VFS
29410 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63   layer that, acc
29420 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c  ording to POSIX,
29430 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   any existing ma
29440 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f  pping .** may no
29450 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64  w be invalid and
29460 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70   should be unmap
29470 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
29480 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73  nt unixUnfetch(s
29490 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
294a0 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
294b0 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
294c0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
294d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20    unixFile *pFd 
294e0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64  = (unixFile *)fd
294f0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
29500 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
29510 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f  ile */.  UNUSED_
29520 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b  PARAMETER(iOff);
29530 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28  ..  /* If p==0 (
29540 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65  unmap the entire
29550 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72   file) then ther
29560 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74  e must be no out
29570 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78  standing .  ** x
29580 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
29590 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d  . Or, if p!=0 (m
295a0 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20  eaning it is an 
295b0 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
295c0 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
295d0 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
295e0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
295f0 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ing.  */.  asser
29600 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d  t( (p==0)==(pFd-
29610 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29  >nFetchOut==0) )
29620 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c  ;..  /* If p!=0,
29630 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74   it must match t
29640 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a  he iOff value. *
29650 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  /.  assert( p==0
29660 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70   || p==&((u8 *)p
29670 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
29680 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20  iOff] );..  if( 
29690 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
296a0 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
296b0 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61  se{.    unixUnma
296c0 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a  pfile(pFd);.  }.
296d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
296e0 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a  nFetchOut>=0 );.
296f0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
29700 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
29710 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29720 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  (p);.  UNUSED_PA
29730 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23  RAMETER(iOff);.#
29740 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
29750 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29760 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
29770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
29780 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
29790 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
297a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297b0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
297c0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
297d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
297f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
29840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  ./*.** This divi
29850 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65  sion contains de
29860 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c  finitions of sql
29870 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29880 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20  objects that.** 
29890 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75  implement variou
298a0 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  s file locking s
298b0 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61  trategies.  It a
298c0 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  lso contains def
298d0 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22  initions.** of "
298e0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
298f0 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e  s.  A finder-fun
29900 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
29910 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72   locate the appr
29920 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74  opriate.** sqlit
29930 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29940 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69  ject for a parti
29950 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66  cular database f
29960 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61  ile.  The pAppDa
29970 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ta.** field of t
29980 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56  he sqlite3_vfs V
29990 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  FS objects are i
299a0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65  nitialized to be
299b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
299c0 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64  the correct find
299d0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er-function for 
299e0 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20  that VFS..**.** 
299f0 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63  Most finder func
29a00 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70  tions return a p
29a10 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65  ointer to a fixe
29a20 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  d sqlite3_io_met
29a30 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  hods.** object. 
29a40 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65   The only intere
29a50 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e  sting finder-fun
29a60 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63  ction is autoloc
29a70 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68  kIoFinder, which
29a80 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  .** looks at the
29a90 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   filesystem type
29aa0 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75   and tries to gu
29ab0 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ess the best loc
29ac0 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79  king.** strategy
29ad0 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a   from that..**.*
29ae0 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e  * For finder-fun
29af0 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a  ction F, two obj
29b00 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
29b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
29b20 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66  he real finder-f
29b30 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46  unction named "F
29b40 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20  Impt()"..**.**  
29b50 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74    (2) A constant
29b60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
29b70 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
29b80 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a  just "F"..**.**.
29b90 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
29ba0 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73  the F pointer is
29bb0 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70   used as the pAp
29bc0 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20  pData value for 
29bd0 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20  VFS.** objects. 
29be0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
29bf0 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  his instead of l
29c00 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20  etting pAppData 
29c10 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c  point.** directl
29c20 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d  y at the finder-
29c30 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43  function since C
29c40 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74  90 rules prevent
29c50 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d   a void*.** from
29c60 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20   be cast into a 
29c70 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
29c80 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ..**.**.** Each 
29c90 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
29ca0 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73   macro generates
29cb0 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a   two objects:.**
29cc0 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74  .**   *  A const
29cd0 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  ant sqlite3_io_m
29ce0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61  ethods object ca
29cf0 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68  ll METHOD that h
29d00 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20  as locking.**   
29d10 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45     methods CLOSE
29d20 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20  , LOCK, UNLOCK, 
29d30 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  CKRESLOCK..**.**
29d40 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74     *  An I/O met
29d50 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
29d60 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45  ion called FINDE
29d70 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  R that returns a
29d80 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20   pointer.**     
29d90 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f   to the METHOD o
29da0 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65  bject in the pre
29db0 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f  vious bullet..*/
29dc0 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f  .#define IOMETHO
29dd0 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44  DS(FINDER,METHOD
29de0 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c  ,VERSION,CLOSE,L
29df0 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43  OCK,UNLOCK,CKLOC
29e00 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a  K,SHMMAP)     \.
29e10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
29e20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29e30 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20  METHOD = {      
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 5c 0a 20               \. 
29e60 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20    VERSION,      
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e80 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20   iVersion */    
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29eb0 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20   CLOSE,         
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ed0 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  xClose */       
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ef0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29f00 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20  unixRead,       
29f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29f20 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20  Read */         
29f30 20 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 5c 0a 20 20 20 75            \.   u
29f50 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20  nixWrite,       
29f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
29f70 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  rite */         
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 5c 0a 20 20 20 75 6e           \.   un
29fa0 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  ixTruncate,     
29fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
29fc0 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20  uncate */       
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29ff0 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  xSync,          
2a000 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
2a010 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  c */            
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2a040 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
2a050 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
2a060 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c        \.   LOCK,
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0a0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a0b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b       \.   UNLOCK
2a0e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a0f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2a100 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a120 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c      \.   CKLOCK,
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2a150 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20  servedLock */   
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
2a180 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
2a190 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
2a1a0 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20  rol */          
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f    \.   unixSecto
2a1d0 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
2a1e0 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
2a1f0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65   \.   unixDevice
2a220 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
2a230 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61    /* xDeviceCapa
2a240 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20  bilities */     
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20  \.   SHMMAP,    
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a280 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20   /* xShmMap */  
2a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a2b0 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c  .   unixShmLock,
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2d0 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20  /* xShmLock */  
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a300 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65     unixShmBarrie
2a310 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
2a320 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a350 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20    unixShmUnmap, 
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a370 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20   xShmUnmap */   
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a3a0 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20   unixFetch,     
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a3c0 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20  xFetch */       
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2a3f0 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20  unixUnfetch,    
2a400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a410 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20  Unfetch */      
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20            \.};  
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a480 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
2a490 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a4a0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44  io_methods *FIND
2a4b0 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63  ER##Impl(const c
2a4c0 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65  har *z, unixFile
2a4d0 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53   *p){   \.  UNUS
2a4e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b  ED_PARAMETER(z);
2a4f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a500 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  R(p);           
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72         \.  retur
2a530 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20  n &METHOD;      
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20        \.}       
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2a5d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a5e0 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20  ethods *(*const 
2a5f0 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68  FINDER)(const ch
2a600 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29  ar*,unixFile *p)
2a610 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44      \.    = FIND
2a620 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a  ER##Impl;../*.**
2a630 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66   Here are all of
2a640 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
2a650 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20  methods objects 
2a660 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a  for each of the.
2a670 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  ** locking strat
2a680 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e  egies.  Function
2a690 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f  s that return po
2a6a0 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20  inters to these 
2a6b0 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61  methods.** are a
2a6c0 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  lso created..*/.
2a6d0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73  IOMETHODS(.  pos
2a6e0 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ixIoFinder,     
2a6f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2a700 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2a710 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f  /.  posixIoMetho
2a720 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2a730 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a740 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a750 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20  */.  3,         
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a770 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2a780 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61  and mmap are ena
2a790 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
2a7a0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2a7b0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2a7c0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
2a7d0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a7e0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2a7f0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c  hod */.  unixUnl
2a800 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a810 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2a820 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
2a830 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2a840 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
2a850 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2a860 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70   */.  unixShmMap
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a880 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2a890 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53  d */.).IOMETHODS
2a8a0 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64  (.  nolockIoFind
2a8b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er,           /*
2a8c0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2a8d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63   name */.  noloc
2a8e0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
2a8f0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2a900 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a910 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2a940 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2a950 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
2a960 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2a970 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2a980 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
2a990 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a9a0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2a9b0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
2a9c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a9d0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2a9e0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
2a9f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2aa00 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2aa10 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2aa20 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa40 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2aa50 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
2aa60 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
2aa70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  r,          /* F
2aa80 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2aa90 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  ame */.  dotlock
2aaa0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2aab0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2aac0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2aad0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2ab00 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2ab10 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f   */.  dotlockClo
2ab20 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2ab30 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2ab40 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63   */.  dotlockLoc
2ab50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2ab60 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2ab70 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  */.  dotlockUnlo
2ab80 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck,            /
2ab90 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2aba0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65   */.  dotlockChe
2abb0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2abc0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2abd0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2abe0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ac00 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2ac10 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
2ac20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2ac30 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
2ac40 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
2ac50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2ac60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2ac70 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
2ac80 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2ac90 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2aca0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2acb0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2ace0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2acf0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ad10 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2ad20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ad40 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2ad50 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad70 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2ad80 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
2ad90 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f  eservedLock,   /
2ada0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2adb0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2adc0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2add0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2ade0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2adf0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
2ae00 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
2ae10 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
2ae20 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2ae30 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
2ae40 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
2ae50 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2ae60 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2ae70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2ae80 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aea0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2aeb0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
2aec0 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c  bled */.  semXCl
2aed0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2aee0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2aef0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f  thod */.  semXLo
2af00 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2af10 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
2af20 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c  hod */.  semXUnl
2af30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2af40 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2af50 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68  thod */.  semXCh
2af60 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2af70 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
2af80 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2af90 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
2afc0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
2afd0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2afe0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2aff0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b000 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2b010 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
2b020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b030 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2b040 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
2b050 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2b060 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2b070 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2b080 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2b0b0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2b0c0 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0e0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2b0f0 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2b120 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b140 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2b150 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
2b160 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2b170 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2b180 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2b190 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b1b0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2b1c0 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
2b1d0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
2b1e0 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
2b1f0 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
2b200 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
2b210 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
2b220 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
2b230 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
2b240 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
2b250 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
2b260 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
2b270 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
2b280 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
2b290 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
2b2a0 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
2b2b0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2b2c0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2b2d0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2b2e0 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
2b2f0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
2b300 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
2b310 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
2b320 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
2b330 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
2b340 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
2b350 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
2b360 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
2b370 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
2b380 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
2b390 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
2b3a0 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
2b3b0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2b3c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2b3d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b3e0 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
2b3f0 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
2b400 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
2b410 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2b420 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2b430 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
2b440 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
2b450 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2b460 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2b470 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
2b480 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
2b490 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
2b4a0 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
2b4b0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2b4c0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2b4d0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2b4e0 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
2b4f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2b500 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b510 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2b520 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b540 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2b550 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70   disabled */.  p
2b560 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
2b570 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2b580 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
2b590 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
2b5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2b5b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
2b5c0 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
2b5d0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2b5e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
2b5f0 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
2b600 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
2b610 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2b620 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b640 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2b650 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2b660 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
2b670 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
2b680 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
2b690 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
2b6a0 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
2b6b0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2b6c0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b6d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b6e0 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
2b6f0 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
2b700 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2b710 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2b720 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
2b730 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
2b740 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2b750 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2b760 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2b770 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2b780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2b790 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2b7a0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
2b7b0 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
2b7c0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2b7d0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
2b7e0 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
2b7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2b800 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
2b810 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
2b820 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2b830 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b840 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
2b850 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
2b860 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b870 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b890 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b8a0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2b8b0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
2b8c0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b8d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b8e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
2b8f0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
2b900 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
2b910 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
2b920 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
2b930 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
2b940 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2b950 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
2b960 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
2b970 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
2b980 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
2b990 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
2b9a0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
2b9b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
2b9c0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
2b9d0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2b9e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b9f0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
2ba00 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2ba10 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2ba20 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2ba30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ba40 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2ba50 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2ba60 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
2ba70 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
2ba80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
2ba90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2baa0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
2bab0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2bac0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
2bad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2bae0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
2baf0 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
2bb00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bb10 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
2bb20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
2bb30 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
2bb40 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
2bb50 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
2bb60 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
2bb70 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
2bb80 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
2bb90 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
2bba0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
2bbb0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
2bbc0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
2bbd0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
2bbe0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
2bbf0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2bc00 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
2bc10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2bc20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
2bc30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2bc40 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2bc50 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2bc60 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2bc70 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2bc80 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2bc90 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2bca0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2bcb0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2bcc0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2bcd0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2bce0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2bcf0 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
2bd00 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
2bd10 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
2bd20 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
2bd30 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
2bd40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
2bd50 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2bd60 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
2bd70 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
2bd80 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
2bd90 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
2bda0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2bdb0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
2bdc0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
2bdd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
2bde0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
2bdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2be00 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
2be10 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
2be20 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
2be30 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
2be40 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
2be50 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
2be60 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
2be70 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
2be80 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
2be90 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
2bea0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
2beb0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
2bec0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2bed0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2bee0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2bef0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2bf00 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2bf10 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2bf20 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2bf30 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2bf40 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2bf50 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
2bf60 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
2bf70 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
2bf80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
2bf90 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
2bfa0 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
2bfb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
2bfc0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
2bfd0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2bfe0 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
2bff0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2c000 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2c010 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2c020 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
2c030 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
2c040 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2c050 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
2c060 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
2c070 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
2c080 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2c090 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2c0a0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
2c0b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
2c0c0 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65  *.** This "finde
2c0d0 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  r" function for 
2c0e0 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74  VxWorks checks t
2c0f0 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20 61  o see if posix a
2c100 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69  dvisory.** locki
2c110 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74  ng works.  If it
2c120 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74   does, then that
2c130 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65 64   is what is used
2c140 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
2c150 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20  t.** work, then 
2c160 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65  fallback to name
2c170 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
2c180 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
2c190 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2c1a0 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73  methods *vxworks
2c1b0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2c1c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2c1d0 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2c1e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c1f0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2c200 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2c210 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
2c220 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
2c230 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
2c240 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2c250 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2c260 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2c270 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2c280 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2c290 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2c2a0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2c2b0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2c2c0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2c2d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2c2e0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2c2f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
2c300 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
2c310 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
2c320 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
2c330 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2c340 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2c350 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
2c360 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
2c370 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2c380 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2c390 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2c3a0 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2c3b0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2c3c0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2c3d0 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2c3e0 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2c3f0 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2c400 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2c410 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2c420 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2c430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
2c440 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
2c450 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2c460 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2c470 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78  s .  *(*const vx
2c480 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63  worksIoFinder)(c
2c490 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2c4a0 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49  ile*) = vxworksI
2c4b0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
2c4c0 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
2c4d0 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  KS */../*.** An 
2c4e0 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
2c4f0 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
2c500 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  n IO method find
2c510 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
2c520 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
2c530 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2c540 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
2c550 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2c560 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
2c570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2c5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5d0 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
2c5e0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2c5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c600 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
2c610 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
2c620 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
2c630 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
2c640 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
2c650 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
2c660 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2c670 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
2c680 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
2c690 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
2c6a0 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
2c6b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2c6c0 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
2c6d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2c6e0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2c6f0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2c700 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c720 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
2c730 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
2c740 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  ng opened */.  s
2c750 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
2c760 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
2c770 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
2c780 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c790 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c7a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
2c7b0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
2c7c0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2c7d0 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2c7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
2c7f0 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49  o or more UNIXFI
2c800 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29  LE_* values */.)
2c810 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
2c820 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
2c830 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
2c840 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
2c850 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
2c860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c870 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2c880 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
2c890 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  NULL );..  /* No
2c8a0 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2c8b0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2c8c0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2c8d0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2c8e0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2c8f0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2c900 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2c910 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2c920 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2c930 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2c940 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2c950 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2c960 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2c970 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2c980 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
2c990 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
2c9a0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2c9b0 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
2c9c0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2c9d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2c9e0 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
2c9f0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2ca00 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
2ca10 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
2ca20 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
2ca30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2ca50 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
2ca60 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2ca70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
2ca80 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2ca90 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
2caa0 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
2cab0 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2cac0 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
2cad0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2cae0 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
2caf0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2cb00 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
2cb10 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
2cb20 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
2cb30 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
2cb40 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
2cb50 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2cb60 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
2cb70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2cb80 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
2cb90 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73  .  if( ctrlFlags
2cba0 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
2cbb0 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  CK ){.    pLocki
2cbc0 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
2cbd0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
2cbe0 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
2cbf0 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
2cc00 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
2cc10 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
2cc20 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
2cc30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2cc40 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
2cc50 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
2cc60 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
2cc70 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
2cc80 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
2cc90 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
2cca0 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
2ccb0 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
2ccc0 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
2ccd0 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
2cce0 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
2ccf0 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
2cd00 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
2cd10 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
2cd20 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
2cd30 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2cd40 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
2cd50 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
2cd60 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
2cd70 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
2cd80 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
2cd90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2cda0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2cdb0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2cdc0 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
2cdd0 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
2cde0 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ds.#endif.  ){. 
2cdf0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2ce00 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2ce10 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2ce20 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2ce30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ce40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ce50 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2ce60 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64  occurred in find
2ce70 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f  InodeInfo(), clo
2ce80 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  se the file desc
2ce90 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20  riptor.      ** 
2cea0 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66  immediately, bef
2ceb0 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68  ore releasing th
2cec0 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f  e mutex. findIno
2ced0 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69  deInfo() may fai
2cee0 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77  l.      ** in tw
2cef0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20  o scenarios:.   
2cf00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
2cf10 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66   (a) A call to f
2cf20 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20  stat() failed.. 
2cf30 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20       **   (b) A 
2cf40 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20  malloc failed.. 
2cf50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2cf60 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61   Scenario (b) ma
2cf70 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  y only occur if 
2cf80 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68  the process is h
2cf90 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a  olding no other.
2cfa0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65        ** file de
2cfb0 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f  scriptors open o
2cfc0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e  n the same file.
2cfd0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f   If there were o
2cfe0 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20  ther file.      
2cff0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  ** descriptors o
2d000 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
2d010 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c  n no malloc woul
2d020 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79  d be required by
2d030 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e  .      ** findIn
2d040 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68  odeInfo(). If th
2d050 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
2d060 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65  it is quite safe
2d070 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   to close.      
2d080 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73  ** handle h - as
2d090 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2d0a0 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20  d that no posix 
2d0b0 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65  locks will be re
2d0c0 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  leased.      ** 
2d0d0 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20  by doing so..   
2d0e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2d0f0 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63  f scenario (a) c
2d100 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20  aused the error 
2d110 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20  then things are 
2d120 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65  not so safe. The
2d130 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63  .      ** implic
2d140 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65  it assumption he
2d150 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73  re is that if fs
2d160 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69  tat() fails, thi
2d170 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20  ngs are in.     
2d180 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61   ** such bad sha
2d190 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67  pe that dropping
2d1a0 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64   a lock or two d
2d1b0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75  oesn't matter mu
2d1c0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2d1d0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2d1e0 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2d1f0 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31  _);.      h = -1
2d200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2d210 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2d220 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2d230 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d240 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2d250 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20  APPLE__).  else 
2d260 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2d270 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f  e == &afpIoMetho
2d280 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50  ds ){.    /* AFP
2d290 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2d2a0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2d2b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2d2c0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2d2d0 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
2d2e0 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
2d2f0 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e     afpLockingCon
2d300 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20  text *pCtx;.    
2d310 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2d320 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71  text = pCtx = sq
2d330 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
2d340 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b  sizeof(*pCtx) );
2d350 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30  .    if( pCtx==0
2d360 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2d370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2d380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d390 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
2d3a0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
2d3b0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2d3c0 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
2d3d0 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
2d3e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
2d3f0 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
2d400 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
2d410 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
2d420 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
2d430 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
2d440 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
2d450 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2d460 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
2d470 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
2d480 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
2d490 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2d4a0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
2d4b0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2d4c0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2d4d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2d4e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d4f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d500 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
2d510 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
2d520 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2d530 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2d540 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
2d550 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
2d560 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2d570 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
2d580 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2d590 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2d5a0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
2d5b0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2d5c0 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
2d5d0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2d5e0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2d5f0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2d600 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2d610 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
2d620 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
2d630 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
2d640 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
2d650 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
2d660 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2d670 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
2d680 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
2d690 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
2d6a0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
2d6b0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2d6c0 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61  malloc64(nFilena
2d6d0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
2d6e0 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
2d6f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2d700 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2d710 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2d720 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69  te3_snprintf(nFi
2d730 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c  lename, zLockFil
2d740 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f  e, "%s" DOTLOCK_
2d750 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d  SUFFIX, zFilenam
2d760 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  e);.    }.    pN
2d770 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2d780 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a  xt = zLockFile;.
2d790 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
2d7a0 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70  RKS.  else if( p
2d7b0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2d7c0 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &semIoMethods ){
2d7d0 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65  .    /* Named se
2d7e0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
2d7f0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2d800 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2d810 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c  o be.    ** incl
2d820 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c  uded in the semL
2d830 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20  ockingContext.  
2d840 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74    */.    unixEnt
2d850 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2d860 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2d870 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2d880 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2d890 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2d8a0 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  && (pNew->pInode
2d8b0 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b  ->pSem==NULL) ){
2d8c0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65  .      char *zSe
2d8d0 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49  mName = pNew->pI
2d8e0 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a  node->aSemName;.
2d8f0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2d900 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d910 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
2d920 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73  , zSemName, "/%s
2d930 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20  .sem",.         
2d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
2d950 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69  ew->pId->zCanoni
2d960 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  calName);.      
2d970 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61  for( n=1; zSemNa
2d980 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20  me[n]; n++ ).   
2d990 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d       if( zSemNam
2d9a0 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d  e[n]=='/' ) zSem
2d9b0 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20  Name[n] = '_';. 
2d9c0 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64       pNew->pInod
2d9d0 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70  e->pSem = sem_op
2d9e0 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43  en(zSemName, O_C
2d9f0 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a  REAT, 0666, 1);.
2da00 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
2da10 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20  pInode->pSem == 
2da20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  SEM_FAILED ){.  
2da30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2da40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2da50 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2da60 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
2da70 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
2da80 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2da90 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2daa0 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72  #endif.  .  stor
2dab0 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c  eLastErrno(pNew,
2dac0 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f   0);.#if OS_VXWO
2dad0 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
2dae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2daf0 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2db00 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2db10 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
2db20 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
2db30 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
2db40 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2db50 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2db60 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64  DELETE;.  }.#end
2db70 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2db80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2db90 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2dba0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2dbb0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2dbc0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2dbd0 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2dbe0 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2dbf0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76  unter(+1);.    v
2dc00 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77  erifyDbFile(pNew
2dc10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2dc20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2dc30 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2dc40 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2dc50 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2dc60 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2dc70 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2dc80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2dc90 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2dca0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2dcb0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2dcc0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2dcd0 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2dce0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2dcf0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2dd00 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2dd10 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
2dd20 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
2dd30 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
2dd40 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20  .     ".".  };. 
2dd50 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20   unsigned int i 
2dd60 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 73 74  = 0;.  struct st
2dd70 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20  at buf;.  const 
2dd80 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c  char *zDir = sql
2dd90 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2dda0 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44  ory;..  if( !azD
2ddb0 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b  irs[0] ) azDirs[
2ddc0 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  0] = getenv("SQL
2ddd0 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
2dde0 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
2ddf0 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
2de00 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2de10 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69   while(1){.    i
2de20 66 28 20 7a 44 69 72 21 3d 30 0a 20 20 20 20 20  f( zDir!=0.     
2de30 26 26 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20  && osStat(zDir, 
2de40 26 62 75 66 29 3d 3d 30 0a 20 20 20 20 20 26 26  &buf)==0.     &&
2de50 20 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f   S_ISDIR(buf.st_
2de60 6d 6f 64 65 29 0a 20 20 20 20 20 26 26 20 6f 73  mode).     && os
2de70 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 33 29  Access(zDir, 03)
2de80 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
2de90 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 20 20   return zDir;.  
2dea0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 73    }.    if( i>=s
2deb0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
2dec0 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 20  zeof(azDirs[0]) 
2ded0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 44 69  ) break;.    zDi
2dee0 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b  r = azDirs[i++];
2def0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2df00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2df10 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2df20 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
2df30 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c   zBuf must be al
2df40 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
2df50 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73  e calling proces
2df60 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69  s and must be bi
2df70 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
2df80 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66   at least.** pVf
2df90 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79  s->mxPathname by
2dfa0 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
2dfb0 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61  nt unixGetTempna
2dfc0 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  me(int nBuf, cha
2dfd0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73  r *zBuf){.  cons
2dfe0 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20  t char *zDir;.  
2dff0 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
2e000 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2e010 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2e020 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2e030 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2e040 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2e050 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2e060 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2e070 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2e080 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2e090 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2e0a0 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66  ng. .  */.  zBuf
2e0b0 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c  [0] = 0;.  Simul
2e0c0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2e0d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
2e0e0 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69  );..  zDir = uni
2e0f0 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a  xTempFileDir();.
2e100 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
2e110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2e120 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b  ERR_GETTEMPPATH;
2e130 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36 34 20 72  .  do{.    u64 r
2e140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
2e150 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
2e160 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 61 73 73  r), &r);.    ass
2e170 65 72 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20  ert( nBuf>2 );. 
2e180 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20     zBuf[nBuf-2] 
2e190 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2e1a0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
2e1b0 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
2e1c0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
2e1d0 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20  IX"%llx%c",.    
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20   zDir, r, 0);.  
2e200 20 20 69 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d    if( zBuf[nBuf-
2e210 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74  2]!=0 || (iLimit
2e220 2b 2b 29 3e 31 30 20 29 20 72 65 74 75 72 6e 20  ++)>10 ) return 
2e230 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2e240 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2e250 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2e260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e270 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2e280 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2e290 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2e2a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2e2b0 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2e2c0 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2e2d0 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2e2e0 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2e2f0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2e300 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2e310 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2e320 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2e330 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2e340 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2e350 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2e360 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2e370 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2e380 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2e390 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2e3a0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2e3b0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2e3c0 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2e3d0 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2e3e0 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2e3f0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2e400 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2e410 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2e420 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2e430 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2e440 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2e450 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2e460 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2e470 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2e480 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2e490 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2e4a0 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2e4b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2e4c0 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2e4d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2e4e0 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2e4f0 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2e500 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2e510 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2e520 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2e530 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2e540 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2e550 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2e560 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2e570 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2e580 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2e590 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2e5a0 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2e5b0 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2e5c0 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2e5d0 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2e5e0 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2e5f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2e600 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2e610 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2e620 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2e630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2e640 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2e650 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2e660 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2e670 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2e680 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2e690 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2e6a0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2e6b0 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2e6c0 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2e6d0 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2e6e0 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2e6f0 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2e700 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2e710 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2e720 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2e730 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2e740 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2e750 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2e760 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2e770 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2e780 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2e790 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2e7a0 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2e7b0 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2e7c0 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2e7d0 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2e7e0 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2e7f0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2e800 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2e810 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2e820 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2e830 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2e840 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2e850 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2e860 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2e870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e880 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2e890 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2e8a0 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ..  unixEnterMut
2e8b0 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41 20 73 74  ex();..  /* A st
2e8c0 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
2e8d0 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
2e8e0 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
2e8f0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
2e900 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
2e910 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
2e920 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
2e930 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
2e940 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
2e950 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
2e960 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2e970 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
2e980 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
2e990 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
2e9a0 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
2e9b0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2e9c0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
2e9d0 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
2e9e0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
2e9f0 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
2ea00 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
2ea10 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
2ea20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
2ea30 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
2ea40 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
2ea50 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
2ea60 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
2ea70 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
2ea80 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69  or a reusable fi
2ea90 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2eaa0 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
2eab0 20 20 69 66 28 20 6e 55 6e 75 73 65 64 46 64 3e    if( nUnusedFd>
2eac0 30 20 26 26 20 30 3d 3d 6f 73 53 74 61 74 28 7a  0 && 0==osStat(z
2ead0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2eae0 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2eaf0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2eb00 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
2eb10 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
2eb20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
2eb30 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
2eb40 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb60 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
2eb70 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29 73 53 74  Id.ino!=(u64)sSt
2eb80 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
2eb90 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
2eba0 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
2ebb0 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
2ebc0 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
2ebd0 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
2ebe0 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
2ebf0 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
2ec00 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
2ec10 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
2ec20 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
2ec30 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
2ec40 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
2ec50 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
2ec60 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a 20 20 20  nUnusedFd--;.   
2ec70 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
2ec80 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
2ec90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 75   }.    }.  }.  u
2eca0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2ecb0 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
2ecc0 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
2ecd0 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
2ece0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2ecf0 74 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e  the mode, uid an
2ed00 64 20 67 69 64 20 6f 66 20 66 69 6c 65 20 7a 46  d gid of file zF
2ed10 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ile. .*/.static 
2ed20 69 6e 74 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  int getFileMode(
2ed30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ed40 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
2ed50 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
2ed60 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
2ed70 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
2ed80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
2ed90 6d 69 73 73 69 6f 6e 73 20 6f 66 20 7a 46 69 6c  missions of zFil
2eda0 65 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  e */.  uid_t *pU
2edb0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2edc0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
2edd0 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a  id of zFile. */.
2ede0 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee00 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 6f 66    /* OUT: gid of
2ee10 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20   zFile. */.){.  
2ee20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2ee30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2ee40 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
2ee50 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
2ee60 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
2ee70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ee80 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 46  if( 0==osStat(zF
2ee90 69 6c 65 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ile, &sStat) ){.
2eea0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74      *pMode = sSt
2eeb0 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37  at.st_mode & 077
2eec0 37 3b 0a 20 20 20 20 2a 70 55 69 64 20 3d 20 73  7;.    *pUid = s
2eed0 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20  Stat.st_uid;.   
2eee0 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73   *pGid = sStat.s
2eef0 74 5f 67 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t_gid;.  }else{.
2ef00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ef10 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
2ef20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ef30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ef40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2ef50 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
2ef60 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
2ef70 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
2ef80 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
2ef90 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
2efa0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2efb0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
2efc0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
2efd0 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
2efe0 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
2eff0 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
2f000 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
2f010 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
2f020 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
2f030 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
2f040 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2f050 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
2f060 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2f070 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
2f080 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
2f090 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  .** In most case
2f0a0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
2f0b0 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30  sets *pMode to 0
2f0c0 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63  , which will bec
2f0d0 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61  ome.** an indica
2f0e0 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f  tion to robust_o
2f0f0 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20  pen() to create 
2f100 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a  the file using.*
2f110 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
2f120 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2f130 53 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68  S adjusted by th
2f140 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20  e umask..** But 
2f150 69 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  if the file bein
2f160 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41  g opened is a WA
2f170 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75  L or regular jou
2f180 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
2f190 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
2f1a0 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69  n queries the fi
2f1b0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2f1c0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e  e permissions on
2f1d0 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70   the .** corresp
2f1e0 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
2f1f0 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70  file and sets *p
2f200 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c  Mode to this val
2f210 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a  ue. Whenever .**
2f220 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61   possible, WAL a
2f230 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
2f240 20 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69   are created usi
2f250 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  ng the same perm
2f260 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74  issions .** as t
2f270 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2f280 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2f290 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
2f2a0 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
2f2b0 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  S option is enab
2f2c0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
2f2d0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
2f2e0 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
2f2f0 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45  e.  But 8_3_NAME
2f300 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  S is only used f
2f310 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79  or.** FAT filesy
2f320 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73  stems and permis
2f330 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74  sions do not mat
2f340 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75  ter there, so ju
2f350 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65  st use.** the de
2f360 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
2f370 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2f380 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d   findCreateFileM
2f390 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode(.  const cha
2f3a0 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2f3b0 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f         /* Path o
2f3c0 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79  f file (possibly
2f3d0 29 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20  ) being created 
2f3e0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f400 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
2f410 73 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75  ssed as 4th argu
2f420 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20  ment to xOpen() 
2f430 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f  */.  mode_t *pMo
2f440 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
2f450 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72       /* OUT: Per
2f460 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e  missions to open
2f470 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
2f480 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73  /* OUT: uid to s
2f4b0 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
2f4c0 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20  /.  gid_t *pGid 
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20      /* OUT: gid 
2f4f0 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
2f500 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
2f510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2f520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f530 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a  turn Code */.  *
2f540 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55  pMode = 0;.  *pU
2f550 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20  id = 0;.  *pGid 
2f560 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  = 0;.  if( flags
2f570 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
2f580 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
2f590 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b  MAIN_JOURNAL) ){
2f5a0 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41  .    char zDb[MA
2f5b0 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20  X_PATHNAME+1];  
2f5c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
2f5d0 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
2f5e0 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
2f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f600 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
2f610 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f   bytes in zDb */
2f620 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69  ..    /* zPath i
2f630 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41  s a path to a WA
2f640 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  L or journal fil
2f650 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
2f660 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20   block derives. 
2f670 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74     ** the path t
2f680 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
2f690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2f6a0 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20  rom zPath. This 
2f6b0 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20  block handles.  
2f6c0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
2f6d0 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e  ng naming conven
2f6e0 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  tions:.    **.  
2f6f0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2f700 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20   db>-journal".  
2f710 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2f720 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a   db>-wal".    **
2f730 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2f740 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20  -journalNN".    
2f750 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2f760 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  b>-walNN".    **
2f770 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
2f780 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75   is a decimal nu
2f790 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d  mber. The NN nam
2f7a0 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
2f7b0 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20  .    ** used by 
2f7c0 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c  the test_multipl
2f7d0 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20  ex.c module..   
2f7e0 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71   */.    nDb = sq
2f7f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2f800 61 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77  ath) - 1; .    w
2f810 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
2f820 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
2f830 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  * In normal oper
2f840 61 74 69 6f 6e 2c 20 74 68 65 20 6a 6f 75 72 6e  ation, the journ
2f850 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 6c  al file name wil
2f860 6c 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e  l always contain
2f870 0a 20 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20  .      ** a '-' 
2f880 63 68 61 72 61 63 74 65 72 2e 20 20 48 6f 77 65  character.  Howe
2f890 76 65 72 20 69 6e 20 38 2b 33 20 66 69 6c 65 6e  ver in 8+3 filen
2f8a0 61 6d 65 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20  ame mode, or if 
2f8b0 61 20 63 6f 72 72 75 70 74 0a 20 20 20 20 20 20  a corrupt.      
2f8c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
2f8d0 6e 61 6c 20 73 70 65 63 69 66 69 65 73 20 61 20  nal specifies a 
2f8e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 77  master journal w
2f8f0 69 74 68 20 61 20 67 6f 6f 66 79 20 6e 61 6d 65  ith a goofy name
2f900 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2f910 74 68 65 20 27 2d 27 20 6d 69 67 68 74 20 62 65  the '-' might be
2f920 20 6d 69 73 73 69 6e 67 2e 20 2a 2f 0a 20 20 20   missing. */.   
2f930 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
2f940 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27   zPath[nDb]=='.'
2f950 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f960 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d  _OK;.      nDb--
2f970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
2f980 70 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e  py(zDb, zPath, n
2f990 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62  Db);.    zDb[nDb
2f9a0 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 72  ] = '\0';..    r
2f9b0 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28  c = getFileMode(
2f9c0 7a 44 62 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64  zDb, pMode, pUid
2f9d0 2c 20 70 47 69 64 29 3b 0a 20 20 7d 65 6c 73 65  , pGid);.  }else
2f9e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2f9f0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2fa00 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70  NCLOSE ){.    *p
2fa10 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d  Mode = 0600;.  }
2fa20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2fa30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
2fa40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2fa50 69 73 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74  is is a main dat
2fa60 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
2fa70 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
2fa80 65 64 20 75 73 69 6e 67 20 61 20 55 52 49 0a 20  ed using a URI. 
2fa90 20 20 20 2a 2a 20 66 69 6c 65 6e 61 6d 65 2c 20     ** filename, 
2faa0 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 6d  check for the "m
2fab0 6f 64 65 6f 66 22 20 70 61 72 61 6d 65 74 65 72  odeof" parameter
2fac0 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 69 6e  . If present, in
2fad0 74 65 72 70 72 65 74 0a 20 20 20 20 2a 2a 20 69  terpret.    ** i
2fae0 74 73 20 76 61 6c 75 65 20 61 73 20 61 20 66 69  ts value as a fi
2faf0 6c 65 6e 61 6d 65 20 61 6e 64 20 74 72 79 20 74  lename and try t
2fb00 6f 20 63 6f 70 79 20 74 68 65 20 6d 6f 64 65 2c  o copy the mode,
2fb10 20 75 69 64 20 61 6e 64 20 67 69 64 20 66 72 6f   uid and gid fro
2fb20 6d 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 69  m.    ** that fi
2fb30 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  le.  */.    cons
2fb40 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
2fb50 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
2fb60 72 28 7a 50 61 74 68 2c 20 22 6d 6f 64 65 6f 66  r(zPath, "modeof
2fb70 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  ");.    if( z ){
2fb80 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 46  .      rc = getF
2fb90 69 6c 65 4d 6f 64 65 28 7a 2c 20 70 4d 6f 64 65  ileMode(z, pMode
2fba0 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20  , pUid, pGid);. 
2fbb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2fbc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
2fbd0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
2fbe0 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
2fbf0 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
2fc00 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
2fc10 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
2fc20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
2fc30 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
2fc40 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2fc50 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
2fc60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2fc70 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
2fc80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2fc90 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
2fca0 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
2fcb0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
2fcc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
2fcd0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
2fce0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
2fcf0 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
2fd00 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
2fd10 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
2fd20 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
2fd30 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
2fd40 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
2fd50 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
2fd60 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
2fd70 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
2fd80 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
2fd90 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
2fda0 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
2fdb0 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
2fdc0 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
2fdd0 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
2fde0 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
2fdf0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
2fe00 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
2fe10 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
2fe20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
2fe30 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
2fe40 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
2fe50 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
2fe60 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
2fe70 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
2fe80 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
2fe90 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
2fea0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2feb0 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
2fec0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2fed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fee0 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
2fef0 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
2ff00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2ff10 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2ff20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2ff30 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
2ff40 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
2ff50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2ff60 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
2ff70 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
2ff80 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
2ff90 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
2ffa0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2ffb0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
2ffc0 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
2ffd0 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
2ffe0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30000 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
30010 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
30020 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
30030 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
30040 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
30050 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30070 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
30080 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
30090 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
300a0 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
300b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
300c0 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
300d0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
300e0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
300f0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
30100 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
30110 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
30120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30130 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
30140 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
30150 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
30160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30180 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
30190 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
301a0 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
301b0 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
301c0 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
301d0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
301e0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
301f0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
30200 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
30210 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
30220 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
30230 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
30240 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
30250 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
30260 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
30270 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
30280 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
30290 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
302a0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
302b0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
302c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
302d0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
302e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
302f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
30300 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
30310 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
30320 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
30330 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
30340 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
30350 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
30360 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
30370 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
30380 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
30390 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
303a0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
303b0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
303c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
303d0 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
303e0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
303f0 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
30400 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
30410 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
30420 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
30430 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
30440 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
30450 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
30460 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
30470 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
30480 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
30490 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
304a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
304b0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
304c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
304d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
304e0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
304f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30500 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
30510 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
30520 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
30530 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
30540 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
30550 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
30560 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
30570 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
30580 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
30590 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
305a0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
305b0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
305c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
305d0 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
305e0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
305f0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
30600 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
30610 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
30620 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
30630 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
30640 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
30650 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
30660 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
30670 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
30680 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
30690 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
306a0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
306b0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
306c0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
306d0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
306e0 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
306f0 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
30700 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
30710 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
30720 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
30730 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
30740 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
30750 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
30760 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
30770 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
30780 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
30790 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
307a0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
307b0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
307c0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
307d0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
307e0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
307f0 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
30800 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
30810 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
30820 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
30830 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
30840 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
30850 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
30860 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
30870 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
30880 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
30890 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
308a0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
308b0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
308c0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
308d0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
308e0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
308f0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
30900 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
30910 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
30920 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
30930 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
30940 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
30950 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
30960 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
30970 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
30980 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
30990 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
309a0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
309b0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
309c0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
309d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
309e0 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
309f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
30a00 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
30a10 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
30a20 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
30a30 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30a40 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
30a50 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
30a60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30a70 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
30a80 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30a90 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
30aa0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
30ab0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
30ac0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
30ad0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30ae0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
30af0 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64   /* Detect a pid
30b00 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65   change and rese
30b10 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65  t the PRNG.  The
30b20 72 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  re is a race con
30b30 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65  dition.  ** here
30b40 20 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f   such that two o
30b50 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61  r more threads a
30b60 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  ll trying to ope
30b70 6e 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20  n databases at. 
30b80 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73   ** the same ins
30b90 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72  tant might all r
30ba0 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20  eset the PRNG.  
30bb0 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73  But multiple res
30bc0 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72  ets.  ** are har
30bd0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mless..  */.  if
30be0 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21  ( randomnessPid!
30bf0 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a  =osGetpid(0) ){.
30c00 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69      randomnessPi
30c10 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b  d = osGetpid(0);
30c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
30c30 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
30c40 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  }..  memset(p, 0
30c50 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
30c60 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
30c70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
30c80 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
30c90 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
30ca0 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
30cb0 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
30cc0 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
30cd0 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
30ce0 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
30cf0 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
30d00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
30d10 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
30d20 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a  alloc64(sizeof(*
30d30 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
30d40 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
30d50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
30d70 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
30d80 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f  .    p->pPreallo
30d90 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 70 55  catedUnused = pU
30da0 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
30db0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
30dc0 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
30dd0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
30de0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
30df0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
30e00 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
30e10 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
30e20 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
30e30 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
30e40 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
30e50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30e60 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
30e70 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
30e80 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
30e90 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
30ea0 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
30eb0 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
30ec0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
30ed0 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
30ee0 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
30ef0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
30f00 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
30f10 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63  syncDir);.    rc
30f20 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
30f30 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  me(pVfs->mxPathn
30f40 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  ame, zTmpname);.
30f50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
30f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30f80 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70      zName = zTmp
30f90 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  name;..    /* Ge
30fa0 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72  nerated temporar
30fb0 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  y filenames are 
30fc0 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65  always double-ze
30fd0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20  ro terminated.  
30fe0 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20    ** for use by 
30ff0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
31000 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20  meter(). */.    
31010 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74  assert( zName[st
31020 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
31030 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  0 );.  }..  /* D
31040 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
31050 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ue of the flags 
31060 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
31070 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69   to POSIX functi
31080 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20  on.  ** open(). 
31090 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61  These must be ca
310a0 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66  lculated even if
310b0 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63   open() is not c
310c0 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74  alled, as.  ** t
310d0 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65  hey may be store
310e0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
310f0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64   file handle and
31100 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
31110 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20  ** 'conch file' 
31120 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e  locking function
31130 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a  s later on.  */.
31140 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
31150 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
31160 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
31170 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
31180 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
31190 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
311a0 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
311b0 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
311c0 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
311d0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
311e0 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
311f0 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
31200 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
31210 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66  O_BINARY);..  if
31220 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f  ( fd<0 ){.    mo
31230 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20  de_t openMode;  
31240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31250 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72  ermissions to cr
31260 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a  eate file with *
31270 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b  /.    uid_t uid;
31280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31290 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f      /* Userid fo
312a0 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
312b0 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20    gid_t gid;    
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312d0 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74  /* Groupid for t
312e0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
312f0 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69  c = findCreateFi
31300 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c  leMode(zName, fl
31310 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
31320 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20  &uid, &gid);.   
31330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31350 72 74 28 20 21 70 2d 3e 70 50 72 65 61 6c 6c 6f  rt( !p->pPreallo
31360 63 61 74 65 64 55 6e 75 73 65 64 20 29 3b 0a 20  catedUnused );. 
31370 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
31380 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
31390 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  WAL || eType==SQ
313a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
313b0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20  OURNAL );.      
313c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
313d0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
313e0 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
313f0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
31400 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
31410 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
31420 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
31430 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b  me, openFlags));
31440 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
31450 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70  Exclusive || (op
31460 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41  enFlags & O_CREA
31470 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  T)!=0 );.    if(
31480 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d   fd<0 && errno!=
31490 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64  EISDIR && isRead
314a0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
314b0 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
314c0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
314d0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
314e0 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
314f0 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26  */.      flags &
31500 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  = ~(SQLITE_OPEN_
31510 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31520 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
31530 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26       openFlags &
31540 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  = ~(O_RDWR|O_CRE
31550 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  AT);.      flags
31560 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
31570 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
31580 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
31590 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52  DONLY;.      isR
315a0 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
315b0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
315c0 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
315d0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
315e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
315f0 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d<0 ){.      rc 
31600 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
31610 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
31620 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61  KPT, "open", zNa
31630 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
31640 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
31650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
31660 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
31670 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20  running as root 
31680 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20  and if creating 
31690 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20  a new rollback. 
316a0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72     ** journal or
316b0 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74   WAL file, set t
316c0 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  he ownership of 
316d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57  the journal or W
316e0 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  AL to be.    ** 
316f0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
31700 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
31710 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
31720 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
31730 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
31740 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31750 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 72 6f  NAL) ){.      ro
31760 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c 20 75  bustFchown(fd, u
31770 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
31780 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
31790 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
317a0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
317b0 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
317c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
317d0 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
317e0 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  sed ){.    p->pP
317f0 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
31800 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
31810 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
31820 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
31830 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
31840 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
31850 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
31860 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
31870 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
31880 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45  LITE_UNLINK_AFTE
31890 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61  R_CLOSE).    zPa
318a0 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  th = sqlite3_mpr
318b0 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65  intf("%s", zName
318c0 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
318d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  ==0 ){.      rob
318e0 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
318f0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
31900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31910 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
31920 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  }.#else.    osUn
31930 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
31940 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
31950 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
31960 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
31970 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
31980 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
31990 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
319a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
319b0 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
319c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
319d0 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28  E.  if( fstatfs(
319e0 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  fd, &fsInfo) == 
319f0 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  -1 ){.    storeL
31a00 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e  astErrno(p, errn
31a10 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  o);.    robust_c
31a20 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
31a30 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
31a40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
31a50 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
31a60 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
31a70 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
31a80 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
31a90 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
31aa0 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
31ab0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
31ac0 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
31ad0 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
31ae0 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73  ncmp("exfat", fs
31af0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
31b00 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
31b10 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
31b20 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
31b30 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
31b40 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  DOS;.  }.#endif.
31b50 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70  .  /* Set up app
31b60 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61  ropriate ctrlFla
31b70 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65  gs */.  if( isDe
31b80 6c 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20  lete )          
31b90 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
31ba0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
31bb0 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  TE;.  if( isRead
31bc0 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20  only )          
31bd0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
31be0 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
31bf0 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79  ;.  noLock = eTy
31c00 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
31c10 4d 41 49 4e 5f 44 42 3b 0a 20 20 69 66 28 20 6e  MAIN_DB;.  if( n
31c20 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20  oLock )         
31c30 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
31c40 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
31c50 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e  OLOCK;.  if( syn
31c60 63 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20  cDir )          
31c70 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
31c80 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
31c90 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67  SYNC;.  if( flag
31ca0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
31cb0 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20  URI ) ctrlFlags 
31cc0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b  |= UNIXFILE_URI;
31cd0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
31ce0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
31cf0 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
31d00 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
31d10 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
31d20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
31d30 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
31d40 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
31d50 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
31d60 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
31d70 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
31d80 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
31d90 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
31da0 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
31db0 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
31dc0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
31dd0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
31de0 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
31df0 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
31e00 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
31e10 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
31e20 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
31e30 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
31e40 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
31e50 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
31e60 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
31e70 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
31e80 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
31e90 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
31ea0 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
31eb0 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
31ec0 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
31ed0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
31ee0 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
31ef0 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
31f00 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
31f10 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
31f20 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
31f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31f40 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
31f50 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
31f60 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
31f70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
31f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31fa0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
31fb0 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
31fc0 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
31fd0 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
31fe0 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
31ff0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
32000 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
32010 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
32020 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
32030 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
32040 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
32050 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
32060 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
32070 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
32080 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
32090 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
320a0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
320b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
320c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
320d0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
320e0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
320f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
32100 61 73 73 65 72 74 28 20 7a 50 61 74 68 3d 3d 30  assert( zPath==0
32110 20 7c 7c 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f   || zPath[0]=='/
32120 27 20 0a 20 20 20 20 20 20 7c 7c 20 65 54 79 70  ' .      || eTyp
32130 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
32140 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  ASTER_JOURNAL ||
32150 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
32160 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
32170 20 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 66 69   .  );.  rc = fi
32180 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
32190 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
321a0 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
321b0 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ..open_finished:
321c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
321d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
321e0 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 50 72 65  te3_free(p->pPre
321f0 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 29  allocatedUnused)
32200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
32210 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
32220 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
32230 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
32240 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
32250 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
32260 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
32270 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
32280 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
32290 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
322a0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
322b0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
322c0 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
322d0 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
322e0 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
322f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
32300 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
32310 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
32320 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
32330 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
32340 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
32350 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
32360 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
32370 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
32380 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32390 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
323a0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
323b0 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
323c0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
323d0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
323e0 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e  );.  if( osUnlin
323f0 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29  k(zPath)==(-1) )
32400 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  {.    if( errno=
32410 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56  =ENOENT.#if OS_V
32420 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 20 20 7c  XWORKS.        |
32430 7c 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68  | osAccess(zPath
32440 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20  ,0)!=0.#endif.  
32450 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
32460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
32470 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d  ETE_NOENT;.    }
32480 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
32490 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
324a0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
324b0 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61  E, "unlink", zPa
324c0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  th);.    }.    r
324d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69  eturn rc;.  }.#i
324e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
324f0 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69  ABLE_DIRSYNC.  i
32500 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31 29  f( (dirSync & 1)
32510 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  !=0 ){.    int f
32520 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  d;.    rc = osOp
32530 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
32540 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28  h, &fd);.    if(
32550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32560 7b 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c  {.      if( full
32570 5f 66 73 79 6e 63 28 66 64 2c 30 2c 30 29 20 29  _fsync(fd,0,0) )
32580 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
32590 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
325a0 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
325b0 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61  NC, "fsync", zPa
325c0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
325d0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
325e0 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
325f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32600 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
32610 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
32620 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
32630 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
32640 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
32650 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
32660 65 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63  est the existenc
32670 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
32680 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
32690 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
326a0 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
326b0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
326c0 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
326d0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
326e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
326f0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
32700 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
32710 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
32720 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
32730 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
32740 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
32750 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
32760 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
32770 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
32780 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
32790 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
327a0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
327b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
327c0 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
327d0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
327e0 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
327f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
32800 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
32810 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
32820 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
32830 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
32840 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
32850 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
32860 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
32870 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
32880 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
32890 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
328a0 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
328b0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
328c0 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
328d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ere */.){.  UNUS
328e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
328f0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
32900 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
32910 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
32920 43 45 53 53 3b 20 29 3b 0a 20 20 61 73 73 65 72  CESS; );.  asser
32930 74 28 20 70 52 65 73 4f 75 74 21 3d 30 20 29 3b  t( pResOut!=0 );
32940 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70 65 63 20  ..  /* The spec 
32950 73 61 79 73 20 74 68 65 72 65 20 61 72 65 20 74  says there are t
32960 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 76 61  hree possible va
32970 6c 75 65 73 20 66 6f 72 20 66 6c 61 67 73 2e 20  lues for flags. 
32980 20 42 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74   But only.  ** t
32990 77 6f 20 6f 66 20 74 68 65 6d 20 61 72 65 20 61  wo of them are a
329a0 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a  ctually used */.
329b0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
329c0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
329d0 58 49 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d  XISTS || flags==
329e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
329f0 41 44 57 52 49 54 45 20 29 3b 0a 0a 20 20 69 66  ADWRITE );..  if
32a00 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
32a10 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b  ACCESS_EXISTS ){
32a20 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
32a30 20 62 75 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f   buf;.    *pResO
32a40 75 74 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28  ut = (0==osStat(
32a50 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
32a60 62 75 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a  buf.st_size>0);.
32a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52    }else{.    *pR
32a80 65 73 4f 75 74 20 3d 20 6f 73 41 63 63 65 73 73  esOut = osAccess
32a90 28 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f  (zPath, W_OK|R_O
32aa0 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74  K)==0;.  }.  ret
32ab0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32ac0 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
32ad0 63 20 69 6e 74 20 6d 6b 46 75 6c 6c 50 61 74 68  c int mkFullPath
32ae0 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
32af0 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
32b00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
32b10 20 70 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20   path */.  char 
32b20 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  *zOut,          
32b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
32b40 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
32b50 20 69 6e 74 20 6e 4f 75 74 20 20 20 20 20 20 20   int nOut       
32b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b70 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
32b80 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4f 75  ze of buffer zOu
32b90 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  t */.){.  int nP
32ba0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ath = sqlite3Str
32bb0 6c 65 6e 33 30 28 7a 50 61 74 68 29 3b 0a 20 20  len30(zPath);.  
32bc0 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
32bd0 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 2f  if( zPath[0]!='/
32be0 27 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 47  ' ){.    if( osG
32bf0 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
32c00 2d 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -2)==0 ){.      
32c10 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
32c20 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
32c30 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77  PEN_BKPT, "getcw
32c40 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  d", zPath);.    
32c50 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c  }.    iOff = sql
32c60 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75  ite3Strlen30(zOu
32c70 74 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66  t);.    zOut[iOf
32c80 66 2b 2b 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a  f++] = '/';.  }.
32c90 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 50 61 74    if( (iOff+nPat
32ca0 68 2b 31 29 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  h+1)>nOut ){.   
32cb0 20 2f 2a 20 53 51 4c 69 74 65 20 61 73 73 75 6d   /* SQLite assum
32cc0 65 73 20 74 68 61 74 20 78 46 75 6c 6c 50 61 74  es that xFullPat
32cd0 68 6e 61 6d 65 28 29 20 6e 75 6c 2d 74 65 72 6d  hname() nul-term
32ce0 69 6e 61 74 65 73 20 74 68 65 20 6f 75 74 70 75  inates the outpu
32cf0 74 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  t buffer.    ** 
32d00 65 76 65 6e 20 69 66 20 69 74 20 72 65 74 75 72  even if it retur
32d10 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f  ns an error.  */
32d20 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 5d 20  .    zOut[iOff] 
32d30 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75  = '\0';.    retu
32d40 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
32d50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  EN_BKPT;.  }.  s
32d60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32d70 6e 4f 75 74 2d 69 4f 66 66 2c 20 26 7a 4f 75 74  nOut-iOff, &zOut
32d80 5b 69 4f 66 66 5d 2c 20 22 25 73 22 2c 20 7a 50  [iOff], "%s", zP
32d90 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ath);.  return S
32da0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
32db0 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
32dc0 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
32dd0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
32de0 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
32df0 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
32e00 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
32e10 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
32e20 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
32e30 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
32e40 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
32e50 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
32e60 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
32e70 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
32e80 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
32e90 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
32ea0 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
32eb0 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
32ec0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
32ed0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
32ee0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
32ef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
32f00 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
32f10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
32f20 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
32f30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
32f40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
32f50 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
32f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
32f70 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
32f80 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
32f90 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32fb0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
32fc0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
32fd0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ff0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
33000 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  fer */.){.#if !d
33010 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44  efined(HAVE_READ
33020 4c 49 4e 4b 29 20 7c 7c 20 21 64 65 66 69 6e 65  LINK) || !define
33030 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20  d(HAVE_LSTAT).  
33040 72 65 74 75 72 6e 20 6d 6b 46 75 6c 6c 50 61 74  return mkFullPat
33050 68 6e 61 6d 65 28 7a 50 61 74 68 2c 20 7a 4f 75  hname(zPath, zOu
33060 74 2c 20 6e 4f 75 74 29 3b 0a 23 65 6c 73 65 0a  t, nOut);.#else.
33070 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33080 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 42 79 74  E_OK;.  int nByt
33090 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 6b 20 3d  e;.  int nLink =
330a0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
330b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
330c0 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 66  symbolic links f
330d0 6f 6c 6c 6f 77 65 64 20 73 6f 20 66 61 72 20 2a  ollowed so far *
330e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
330f0 7a 49 6e 20 3d 20 7a 50 61 74 68 3b 20 20 20 20  zIn = zPath;    
33100 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20    /* Input path 
33110 66 6f 72 20 65 61 63 68 20 69 74 65 72 61 74 69  for each iterati
33120 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  on of loop */.  
33130 63 68 61 72 20 2a 7a 44 65 6c 20 3d 20 30 3b 0a  char *zDel = 0;.
33140 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
33150 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
33160 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
33170 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
33180 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 49 74 27  pVfs);..  /* It'
33190 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
331a0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
331b0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
331c0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
331d0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
331e0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
331f0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
33200 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
33210 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
33220 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
33230 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
33240 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
33250 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
33260 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
33270 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
33280 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
33290 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
332a0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
332b0 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 64 6f 20  _ERROR );..  do 
332c0 7b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73  {..    /* Call s
332d0 74 61 74 28 29 20 6f 6e 20 70 61 74 68 20 7a 49  tat() on path zI
332e0 6e 2e 20 53 65 74 20 62 4c 69 6e 6b 20 74 6f 20  n. Set bLink to 
332f0 74 72 75 65 20 69 66 20 74 68 65 20 70 61 74 68  true if the path
33300 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 0a 20   is a symbolic. 
33310 20 20 20 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20 66     ** link, or f
33320 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
33330 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4c 69 6e   */.    int bLin
33340 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  k = 0;.    struc
33350 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
33360 69 66 28 20 6f 73 4c 73 74 61 74 28 7a 49 6e 2c  if( osLstat(zIn,
33370 20 26 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20   &buf)!=0 ){.   
33380 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e     if( errno!=EN
33390 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  OENT ){.        
333a0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
333b0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
333c0 4e 5f 42 4b 50 54 2c 20 22 6c 73 74 61 74 22 2c  N_BKPT, "lstat",
333d0 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20   zIn);.      }. 
333e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
333f0 62 4c 69 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b 28  bLink = S_ISLNK(
33400 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20  buf.st_mode);.  
33410 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4c 69    }..    if( bLi
33420 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nk ){.      if( 
33430 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zDel==0 ){.     
33440 20 20 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65     zDel = sqlite
33450 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a  3_malloc(nOut);.
33460 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c          if( zDel
33470 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
33480 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
33490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2b 2b      }else if( ++
334a0 6e 4c 69 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41 58  nLink>SQLITE_MAX
334b0 5f 53 59 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20 20  _SYMLINKS ){.   
334c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
334d0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
334e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
334f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33500 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74   ){.        nByt
33510 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a  e = osReadlink(z
33520 49 6e 2c 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d 31  In, zDel, nOut-1
33530 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
33540 42 79 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Byte<0 ){.      
33550 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
33560 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
33570 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61  TOPEN_BKPT, "rea
33580 64 6c 69 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20 20  dlink", zIn);.  
33590 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
335a0 20 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 5b         if( zDel[
335b0 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  0]!='/' ){.     
335c0 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
335d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6e 20            for(n 
335e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
335f0 30 28 7a 49 6e 29 3b 20 6e 3e 30 20 26 26 20 7a  0(zIn); n>0 && z
33600 49 6e 5b 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e 2d  In[n-1]!='/'; n-
33610 2d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -);.            
33620 69 66 28 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e 4f  if( nByte+n+1>nO
33630 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
33640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33650 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
33660 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
33670 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33680 6d 65 6d 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e 5d  memmove(&zDel[n]
33690 2c 20 7a 44 65 6c 2c 20 6e 42 79 74 65 2b 31 29  , zDel, nByte+1)
336a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
336b0 6d 65 6d 63 70 79 28 7a 44 65 6c 2c 20 7a 49 6e  memcpy(zDel, zIn
336c0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
336d0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a      nByte += n;.
336e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
336f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33700 20 20 20 20 7a 44 65 6c 5b 6e 42 79 74 65 5d 20      zDel[nByte] 
33710 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
33720 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
33730 20 7a 49 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20 20   zIn = zDel;.   
33740 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
33750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
33760 20 7a 49 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a 49   zIn!=zOut || zI
33770 6e 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 20  n[0]=='/' );.   
33780 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33790 4f 4b 20 26 26 20 7a 49 6e 21 3d 7a 4f 75 74 20  OK && zIn!=zOut 
337a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6b  ){.      rc = mk
337b0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 49 6e  FullPathname(zIn
337c0 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 20  , zOut, nOut);. 
337d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4c 69     }.    if( bLi
337e0 6e 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  nk==0 ) break;. 
337f0 20 20 20 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a 20     zIn = zOut;. 
33800 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
33810 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c  ITE_OK );..  sql
33820 69 74 65 33 5f 66 72 65 65 28 7a 44 65 6c 29 3b  ite3_free(zDel);
33830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
33840 6e 64 69 66 20 20 20 2f 2a 20 48 41 56 45 5f 52  ndif   /* HAVE_R
33850 45 41 44 4c 49 4e 4b 20 26 26 20 48 41 56 45 5f  EADLINK && HAVE_
33860 4c 53 54 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69 66  LSTAT */.}...#if
33870 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33880 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
33890 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
338a0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
338b0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
338c0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
338d0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
338e0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
338f0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
33900 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
33910 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
33920 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
33930 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
33940 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
33950 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
33960 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
33970 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33980 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
33990 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
339a0 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
339b0 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
339c0 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
339d0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
339e0 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
339f0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
33a00 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
33a10 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
33a20 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
33a30 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
33a40 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
33a50 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
33a60 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
33a70 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
33a80 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
33a90 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
33aa0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
33ab0 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
33ac0 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
33ad0 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
33ae0 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
33af0 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
33b00 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
33b10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33b20 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
33b30 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
33b40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
33b50 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
33b60 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33b70 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
33b80 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
33b90 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
33ba0 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
33bb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
33bc0 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
33bd0 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
33be0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
33bf0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
33c00 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
33c10 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
33c20 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
33c30 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
33c40 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
33c50 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
33c60 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
33c70 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
33c80 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
33c90 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
33ca0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
33cb0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
33cc0 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
33cd0 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
33ce0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
33cf0 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
33d00 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
33d10 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
33d20 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
33d30 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
33d40 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
33d50 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
33d60 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
33d70 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
33d80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
33d90 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
33da0 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
33db0 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
33dc0 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
33dd0 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
33de0 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
33df0 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
33e00 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
33e10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
33e20 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
33e30 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
33e40 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
33e50 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
33e60 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
33e70 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
33e80 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
33e90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
33ea0 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
33eb0 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
33ec0 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
33ed0 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
33ee0 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
33ef0 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
33f00 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
33f10 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
33f20 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
33f30 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
33f40 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
33f50 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
33f60 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
33f70 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
33f80 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
33f90 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
33fa0 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
33fb0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
33fc0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
33fd0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33fe0 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
33ff0 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
34000 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
34010 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
34020 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
34030 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
34040 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
34050 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
34060 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
34070 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
34080 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
34090 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
340a0 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
340b0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
340c0 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
340d0 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
340e0 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
340f0 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
34100 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
34110 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
34120 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
34130 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
34140 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
34150 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
34160 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
34170 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
34180 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
34190 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
341a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
341b0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
341c0 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
341d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
341e0 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
341f0 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
34200 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
34210 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
34220 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
34230 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
34240 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
34250 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
34260 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
34270 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
34280 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
34290 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
342a0 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
342b0 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
342c0 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
342d0 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
342e0 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
342f0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
34300 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
34310 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
34320 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
34330 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
34340 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
34350 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
34360 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
34370 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
34380 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
34390 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
343a0 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
343b0 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
343c0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
343d0 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
343e0 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
343f0 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
34400 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
34410 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
34420 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
34430 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
34440 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
34450 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
34460 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
34470 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
34480 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
34490 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
344a0 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65  Buf);.  randomne
344b0 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64  ssPid = osGetpid
344c0 28 30 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69  (0);  .#if !defi
344d0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
344e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
344f0 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
34500 45 53 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  ESS).  {.    int
34510 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64   fd, got;.    fd
34520 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22   = robust_open("
34530 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
34540 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
34550 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
34560 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
34570 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
34580 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
34590 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
345a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
345b0 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26  uf[sizeof(t)], &
345c0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73  randomnessPid, s
345d0 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73  izeof(randomness
345e0 50 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  Pid));.      ass
345f0 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73  ert( sizeof(t)+s
34600 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73  izeof(randomness
34610 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  Pid)<=(size_t)nB
34620 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
34630 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
34640 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73  izeof(randomness
34650 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Pid);.    }else{
34660 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d  .      do{ got =
34670 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66   osRead(fd, zBuf
34680 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28  , nBuf); }while(
34690 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
346a0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
346b0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
346c0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
346d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
346e0 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
346f0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
34700 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
34710 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
34720 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
34730 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
34740 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
34750 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
34760 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
34770 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
34780 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
34790 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
347a0 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
347b0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
347c0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
347d0 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
347e0 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
347f0 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
34800 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
34810 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
34820 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
34830 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
34840 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
34850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
34860 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
34870 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
34880 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
34890 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
348a0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
348b0 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
348c0 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
348d0 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
348e0 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
348f0 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
34900 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
34910 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
34920 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
34930 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34940 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
34950 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
34960 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
34970 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
34980 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
34990 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
349a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
349b0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
349c0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
349d0 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
349e0 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
349f0 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
34a00 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
34a10 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
34a20 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
34a30 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
34a40 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
34a50 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
34a60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
34a70 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
34a80 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
34a90 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
34aa0 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
34ab0 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
34ac0 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
34ad0 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
34ae0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
34af0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
34b00 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
34b10 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
34b20 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
34b30 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
34b40 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
34b50 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
34b60 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
34b70 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
34b80 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
34b90 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
34ba0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
34bb0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
34bc0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
34bd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
34be0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
34bf0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
34c00 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
34c10 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
34c20 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
34c30 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
34c40 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
34c50 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
34c60 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
34c70 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
34c80 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
34c90 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
34ca0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
34cb0 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
34cc0 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
34cd0 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
34ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34cf0 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
34d00 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
34d10 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
34d20 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
34d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34d40 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
34d50 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
34d60 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
34d70 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
34d80 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
34d90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
34da0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
34db0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
34dc0 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e  64)8640000;.  in
34dd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34de0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
34df0 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
34e00 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
34e10 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
34e20 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
34e30 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
34e40 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
34e50 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
34e60 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
34e70 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
34e80 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
34e90 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
34ea0 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
34eb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
34ec0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
34ed0 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
34ee0 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
34ef0 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
34f00 28 76 6f 69 64 29 67 65 74 74 69 6d 65 6f 66 64  (void)gettimeofd
34f10 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f  ay(&sNow, 0);  /
34f20 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69  * Cannot fail gi
34f30 76 65 6e 20 76 61 6c 69 64 20 61 72 67 75 6d 65  ven valid argume
34f40 6e 74 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20  nts */.  *piNow 
34f50 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
34f60 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
34f70 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
34f80 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
34f90 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
34fa0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
34fb0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
34fc0 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
34fd0 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
34fe0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
34ff0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
35000 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
35010 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
35020 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
35030 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
35040 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
35050 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
35060 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  CATED./*.** Find
35070 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
35080 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
35090 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
350a0 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
350b0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
350c0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
350d0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
350e0 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
350f0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
35100 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
35110 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
35120 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
35130 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
35140 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
35150 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
35160 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
35170 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
35180 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
35190 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
351a0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
351b0 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54  c = unixCurrentT
351c0 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
351d0 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
351e0 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
351f0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
35200 20 64 65 66 69 6e 65 20 75 6e 69 78 43 75 72 72   define unixCurr
35210 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e 64 69 66  entTime 0.#endif
35220 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 47 65 74  ../*.** The xGet
35230 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
35240 6f 64 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  od is designed t
35250 6f 20 72 65 74 75 72 6e 20 61 20 62 65 74 74 65  o return a bette
35260 72 0a 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  r.** low-level e
35270 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
35280 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
35290 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
352a0 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
352b0 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
352c0 20 4f 6e 6c 79 20 74 68 65 20 69 6e 74 65 67 65   Only the intege
352d0 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  r return code is
352e0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73   currently.** us
352f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
35300 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
35310 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
35320 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
35330 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
35340 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
35350 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
35360 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
35370 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
35380 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
35390 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
353a0 0a 20 20 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b  .  return errno;
353b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
353c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
353d0 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
353e0 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
353f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35400 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
35410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35450 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
35460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
354a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
354b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
354c0 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
354d0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
354e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
354f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
35500 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
35510 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
35520 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
35530 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
35540 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
35550 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
35560 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
35570 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
35580 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
35590 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
355a0 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
355b0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
355c0 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
355d0 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
355e0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
355f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
35600 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
35610 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
35620 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
35630 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
35640 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
35650 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
35660 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
35670 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
35680 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
35690 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
356a0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
356b0 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
356c0 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
356d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
356e0 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
356f0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
35700 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
35710 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
35720 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
35730 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
35740 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
35750 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
35760 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
35770 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
35780 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
35790 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
357a0 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
357b0 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
357c0 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
357d0 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
357e0 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
357f0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
35800 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
35810 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
35820 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
35830 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
35840 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
35850 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
35860 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
35870 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
35880 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
35890 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
358a0 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
358b0 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
358c0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
358d0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
358e0 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
358f0 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
35900 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
35910 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
35920 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
35930 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
35940 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
35950 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
35960 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
35970 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
35980 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
35990 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
359a0 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
359b0 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
359c0 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
359d0 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
359e0 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
359f0 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
35a00 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
35a10 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
35a20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
35a30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
35a40 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
35a50 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
35a60 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
35a70 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
35a80 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
35a90 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
35aa0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
35ab0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
35ac0 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
35ad0 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
35ae0 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
35af0 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
35b00 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
35b10 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
35b20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
35b30 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
35b40 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
35b50 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
35b60 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
35b70 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
35b80 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
35b90 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
35ba0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
35bb0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
35bc0 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
35bd0 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
35be0 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
35bf0 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
35c00 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
35c10 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
35c20 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
35c30 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
35c40 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
35c50 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
35c60 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
35c70 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
35c80 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
35c90 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
35ca0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
35cb0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
35cc0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
35cd0 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
35ce0 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
35cf0 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
35d00 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
35d10 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
35d20 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
35d30 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
35d40 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
35d50 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
35d60 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
35d70 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
35d80 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
35d90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
35da0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
35db0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
35dc0 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
35dd0 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
35de0 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
35df0 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
35e00 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
35e10 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
35e20 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
35e30 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
35e40 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c  LITE_FCNTL_SET_L
35e50 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e70 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
35e80 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
35e90 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
35ea0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
35eb0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  name, SQLITE_FCN
35ec0 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
35ed0 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
35ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
35ef0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
35f00 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
35f10 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
35f20 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
35f30 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
35f40 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
35f50 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
35f60 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
35f70 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
35f80 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
35f90 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
35fa0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
35fb0 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
35fc0 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
35fd0 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
35fe0 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
35ff0 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
36000 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
36010 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
36020 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
36030 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
36040 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
36050 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
36060 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
36070 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
36080 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
36090 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
360a0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
360b0 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
360c0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
360d0 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
360e0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
360f0 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
36100 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
36110 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
36120 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
36130 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
36140 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
36150 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
36160 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
36170 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
36180 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
36190 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
361a0 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
361b0 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
361c0 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
361d0 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
361e0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
361f0 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
36200 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
36210 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
36220 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
36230 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
36240 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
36250 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
36260 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
36270 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
36280 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
36290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
362a0 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
362b0 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
362c0 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
362d0 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
362e0 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
362f0 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
36300 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
36310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36320 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
36330 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
36340 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
36350 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
36360 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
36370 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
36380 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
36390 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
363a0 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
363b0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
363c0 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
363d0 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
363e0 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
363f0 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
36400 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
36410 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
36420 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
36430 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
36440 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
36450 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
36460 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
36470 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
36480 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
36490 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
364a0 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
364b0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
364c0 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
364d0 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
364e0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
364f0 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
36500 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
36510 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
36520 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
36530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36540 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
36550 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
36560 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
36570 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
36580 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20 63 6f  exist, or its co
36590 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
365a0 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
365b0 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
365c0 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
365d0 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
365e0 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
365f0 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
36600 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
36610 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
36620 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
36630 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
36640 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
36650 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
36660 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
36670 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
36680 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
36690 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
366a0 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
366b0 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
366c0 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
366d0 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
366e0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
366f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
36700 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
36710 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
36720 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
36730 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
36740 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
36750 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
36760 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
36770 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
36780 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
36790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
367a0 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
367b0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
367c0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
367d0 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
367e0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
367f0 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
36800 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
36810 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
36820 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
36830 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
36840 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
36850 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
36860 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
36870 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
36880 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
36890 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
368a0 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
368b0 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
368c0 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
368d0 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
368e0 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
368f0 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
36900 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
36910 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
36920 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
36930 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
36940 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
36950 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
36960 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
36970 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
36980 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
36990 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
369a0 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
369b0 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
369c0 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
369d0 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
369e0 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
369f0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
36a00 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
36a10 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
36a20 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
36a30 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
36a40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
36a50 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
36a60 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
36a70 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
36a80 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
36a90 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
36aa0 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
36ab0 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
36ac0 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
36ad0 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
36ae0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
36af0 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
36b00 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
36b10 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
36b20 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
36b30 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
36b40 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
36b50 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
36b60 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
36b70 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
36b80 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
36b90 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
36ba0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
36bb0 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
36bc0 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
36bd0 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
36be0 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
36bf0 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
36c00 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
36c10 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
36c20 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
36c30 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
36c40 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
36c50 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
36c60 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
36c70 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
36c80 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
36c90 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
36ca0 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
36cb0 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
36cc0 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
36cd0 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
36ce0 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
36cf0 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
36d00 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
36d10 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
36d20 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
36d30 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
36d40 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
36d50 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
36d60 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
36d70 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
36d80 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
36d90 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
36da0 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
36db0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
36dc0 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
36dd0 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
36de0 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
36df0 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
36e00 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
36e10 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
36e20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
36e30 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
36e40 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
36e50 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
36e60 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
36e70 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ly calling the S
36e80 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
36e90 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
36ea0 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
36eb0 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
36ec0 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
36ed0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
36ee0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
36ef0 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
36f00 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
36f10 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
36f20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
36f30 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
36f40 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
36f50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
36f60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
36f70 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
36f80 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
36f90 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
36fa0 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
36fb0 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
36fc0 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
36fd0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
36fe0 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
36ff0 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
37000 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
37010 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
37020 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
37030 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
37040 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
37050 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
37060 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
37070 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
37080 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
37090 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
370a0 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
370b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
370c0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
370d0 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
370e0 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
370f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
37100 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
37110 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
37120 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
37130 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
37140 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
37150 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
37160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37170 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
37180 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
37190 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74  ockless */.  int
371a0 20 6e 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20   nFails;        
371b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
371c0 62 65 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b  ber of conch tak
371d0 69 6e 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  ing failures */.
371e0 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
371f0 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
37200 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
37210 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
37220 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
37230 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
37240 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
37250 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
37260 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
37270 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
37280 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
37290 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
372a0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
372b0 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
372c0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
372d0 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
372e0 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
372f0 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
37300 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
37310 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
37320 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
37330 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
37340 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
37350 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
37360 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
37370 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
37380 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
37390 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
373a0 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
373b0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
373c0 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
373d0 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
373e0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
373f0 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
37400 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
37410 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
37420 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
37430 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
37440 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
37450 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
37460 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
37470 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
37480 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
37490 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
374a0 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74  th, errno, osGet
374b0 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20  pid(0)));.      
374c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
374d0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
374e0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
374f0 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
37500 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
37510 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
37520 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
37530 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
37540 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
37550 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
37560 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
37570 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
37580 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
37590 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
375a0 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
375b0 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
375c0 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
375d0 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
375e0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
375f0 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
37600 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
37610 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
37620 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
37630 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
37640 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
37650 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
37660 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
37670 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
37680 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
37690 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
376a0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
376b0 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
376c0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
376d0 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
376e0 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
376f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37700 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
37710 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
37720 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
37730 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
37740 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
37750 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
37760 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
37770 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
37780 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
37790 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
377a0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
377b0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
377c0 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
377d0 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
377e0 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
377f0 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
37800 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
37810 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
37820 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
37830 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
37840 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
37850 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
37860 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
37870 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
37880 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
37890 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
378a0 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
378b0 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
378c0 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
378d0 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
378e0 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
378f0 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
37900 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
37910 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
37920 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
37930 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
37940 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
37950 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
37960 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
37970 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
37980 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
37990 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
379a0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
379b0 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
379c0 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
379d0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
379e0 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
379f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
37a00 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
37a10 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
37a20 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
37a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a40 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
37a50 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
37a60 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37a70 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
37a80 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
37a90 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65 74 70 69  ockPath, osGetpi
37aa0 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20 20 20  d(0)));.        
37ab0 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a      return err;.
37ac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
37ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37ae0 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20      start=i+1;. 
37af0 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20     }.    buf[i] 
37b00 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20  = lockPath[i];. 
37b10 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43   }.  OSTRACE(("C
37b20 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70  REATELOCKPATH  p
37b30 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
37b40 73 20 70 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63 6b  s pid=%d\n",lock
37b50 50 61 74 68 2c 6f 73 47 65 74 70 69 64 28 30 29  Path,osGetpid(0)
37b60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
37b70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
37b80 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
37b90 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
37ba0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
37bb0 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
37bc0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
37bd0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
37be0 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
37bf0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
37c00 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
37c10 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
37c20 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
37c30 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
37c40 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
37c50 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
37c60 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
37c70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37c80 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
37c90 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
37ca0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
37cb0 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
37cc0 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
37cd0 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
37ce0 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
37cf0 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
37d00 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
37d10 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
37d20 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
37d30 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
37d40 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
37d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
37d60 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
37d70 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
37d80 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
37d90 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  nt fd = -1;.  un
37da0 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
37db0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37dc0 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  OK;.  int openFl
37dd0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
37de0 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65  _CREAT;.  sqlite
37df0 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a  3_vfs dummyVfs;.
37e00 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30    int terrno = 0
37e10 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
37e20 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c   *pUnused = NULL
37e30 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74  ;..  /* 1. first
37e40 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65   try to open/cre
37e50 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  ate the file.  *
37e60 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 2. if that fai
37e70 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ls, and this is 
37e80 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74  a lock file (not
37e90 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65  -conch), try cre
37ea0 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70  ating.  ** the p
37eb0 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65  arent directorie
37ec0 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61  s and then try a
37ed0 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66  gain..  ** 3. if
37ee0 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79   that fails, try
37ef0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
37f00 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a  e read-only.  **
37f10 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   otherwise retur
37f20 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20  n BUSY (if lock 
37f30 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45  file) or CANTOPE
37f40 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  N for the conch 
37f50 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75  file.  */.  pUnu
37f60 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
37f70 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46  leFd(path, openF
37f80 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e  lags);.  if( pUn
37f90 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d  used ){.    fd =
37fa0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
37fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73  }else{.    pUnus
37fc0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
37fd0 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55  loc64(sizeof(*pU
37fe0 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
37ff0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
38000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38010 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
38020 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
38030 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
38040 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
38050 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
38060 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
38070 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
38080 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
38090 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
380a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
380b0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
380c0 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
380d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
380e0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
380f0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
38100 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
38110 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
38120 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
38130 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
38140 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
38150 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
38160 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
38170 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
38180 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
38190 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
381a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
381b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
381c0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
381d0 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
381e0 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
381f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
38200 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
38210 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
38220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38230 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
38240 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
38250 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
38260 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
38270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
38280 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
38290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
382a0 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
382b0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
382c0 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e 65  oc64(sizeof(*pNe
382d0 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  w));.  if( pNew=
382e0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  =NULL ){.    rc 
382f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
38300 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  KPT;.    goto en
38310 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a  d_create_proxy;.
38320 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
38330 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  w, 0, sizeof(uni
38340 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d  xFile));.  pNew-
38350 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
38360 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74  nFlags;.  memset
38370 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73  (&dummyVfs, 0, s
38380 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29  izeof(dummyVfs))
38390 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70  ;.  dummyVfs.pAp
383a0 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  pData = (void*)&
383b0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
383c0 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61  ;.  dummyVfs.zNa
383d0 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20  me = "dummy";.  
383e0 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64  pUnused->fd = fd
383f0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61  ;.  pUnused->fla
38400 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a  gs = openFlags;.
38410 20 20 70 4e 65 77 2d 3e 70 50 72 65 61 6c 6c 6f    pNew->pPreallo
38420 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 70 55  catedUnused = pU
38430 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
38440 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
38450 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
38460 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
38470 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
38480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
38490 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
384a0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
384b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
384c0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
384d0 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
384e0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
384f0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
38500 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
38510 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
38520 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
38530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
38540 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
38550 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
38560 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
38570 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
38580 74 69 64 2