/ Hex Artifact Content
Login

Artifact f36ad99b752d4abf1b8c1d1b8ea83fa6a5010c7a76cf6a0a76abb83641aa8948:


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 23 64 65  nix only */..#de
0850: 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 48 41 52  fine SQLITE_SHAR
0860: 45 44 5f 4d 41 50 50 49 4e 47 20 31 0a 0a 2f 2a  ED_MAPPING 1../*
0870: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61  .** There are va
0880: 72 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f  rious methods fo
0890: 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  r file locking u
08a0: 73 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  sed for concurre
08b0: 6e 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a  ncy.** control:.
08c0: 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58  **.**   1. POSIX
08d0: 20 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65   locking (the de
08e0: 66 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20  fault),.**   2. 
08f0: 4e 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20  No locking,.**  
0900: 20 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63   3. Dot-file loc
0910: 6b 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c  king,.**   4. fl
0920: 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  ock() locking,.*
0930: 2a 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69  *   5. AFP locki
0940: 6e 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a  ng (OSX only),.*
0950: 2a 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53  *   6. Named POS
0960: 49 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56  IX semaphores (V
0970: 58 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a  XWorks only),.**
0980: 20 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b     7. proxy lock
0990: 69 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a  ing. (OSX only).
09a0: 2a 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20  **.** Styles 4, 
09b0: 35 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c  5, and 7 are onl
09c0: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53  y available of S
09d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
09e0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73  KING_STYLE.** is
09f0: 20 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20   defined to 1.  
0a00: 54 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  The SQLITE_ENABL
0a10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0a20: 61 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74  also enables aut
0a30: 6f 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74  omatic.** select
0a40: 69 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f  ion of the appro
0a50: 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73  priate locking s
0a60: 74 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68  tyle based on th
0a70: 65 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20  e filesystem.** 
0a80: 77 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61  where the databa
0a90: 73 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20  se is located.  
0aa0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
0ab0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
0ac0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20  OCKING_STYLE).# 
0ad0: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   if defined(__AP
0ae0: 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69  PLE__).#    defi
0af0: 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
0b00: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31  _LOCKING_STYLE 1
0b10: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
0b20: 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42  fine SQLITE_ENAB
0b30: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0b40: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0b50: 69 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64  if../* Use pread
0b60: 28 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20  () and pwrite() 
0b70: 69 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69  if they are avai
0b80: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66  lable */.#if def
0b90: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0ba0: 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52  # define HAVE_PR
0bb0: 45 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48  EAD 1.# define H
0bc0: 41 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e  AVE_PWRITE 1.#en
0bd0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
0be0: 48 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26  HAVE_PREAD64) &&
0bf0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57   defined(HAVE_PW
0c00: 52 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20  RITE64).# undef 
0c10: 55 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69  USE_PREAD.# defi
0c20: 6e 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31  ne USE_PREAD64 1
0c30: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
0c40: 41 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65  AVE_PREAD) && de
0c50: 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54  fined(HAVE_PWRIT
0c60: 45 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50  E).# undef USE_P
0c70: 52 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20  READ64.# define 
0c80: 55 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64  USE_PREAD 1.#end
0c90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61  if../*.** standa
0ca0: 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73  rd include files
0cb0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0cc0: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0cd0: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0ce0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
0cf0: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  l.h>.#include <s
0d00: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63  ys/ioctl.h>.#inc
0d10: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
0d20: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
0d30: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0d40: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
0d50: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21   <errno.h>.#if !
0d60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0d70: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
0d80: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
0d90: 3e 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  >0.# include <sy
0da0: 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66  s/mman.h>.#endif
0db0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
0dc0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
0dd0: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  E.# include <sys
0de0: 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c  /ioctl.h>.# incl
0df0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0e00: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0e10: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0e20: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0e30: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0e40: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
0e50: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
0e60: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
0e70: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0e80: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45         (__IPHONE
0eb0: 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  _OS_VERSION_MIN_
0ec0: 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29  REQUIRED > 2000)
0ed0: 29 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65  ).#  if (!define
0ee0: 64 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45  d(TARGET_OS_EMBE
0ef0: 44 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54  DDED) || (TARGET
0f00: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29  _OS_EMBEDDED==0)
0f10: 29 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21  ) \.       && (!
0f20: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49  defined(TARGET_I
0f30: 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29  PHONE_SIMULATOR)
0f40: 20 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f   || (TARGET_IPHO
0f50: 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29  NE_SIMULATOR==0)
0f60: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41  ).#    define HA
0f70: 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31  VE_GETHOSTUUID 1
0f80: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61  .#  else.#    wa
0f90: 72 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75  rning "gethostuu
0fa0: 69 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  id() is disabled
0fb0: 2e 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .".#  endif.#end
0fc0: 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  if...#if OS_VXWO
0fd0: 52 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  RKS.# include <s
0fe0: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e  ys/ioctl.h>.# in
0ff0: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
1000: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c  .h>.# include <l
1010: 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20  imits.h>.#endif 
1020: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1030: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1040: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
1050: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1060: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
1070: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
1080: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
1090: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
10a0: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
10b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
10c0: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
10d0: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
10e0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
10f0: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
1100: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
1110: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
1120: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
1130: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
1140: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
1150: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
1160: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1170: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
1180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
1190: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
11a0: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
11b0: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
11c0: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
11d0: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
11e0: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
11f0: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
1200: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1210: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1220: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1230: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1240: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1250: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
1260: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1270: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1280: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1290: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
12a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
12b0: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
12c0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
12d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
12e0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
12f0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
1300: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
1310: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1320: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1330: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1340: 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  2../*.** Maximum
1350: 20 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f   supported symbo
1360: 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65  lic links.*/.#de
1370: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
1380: 53 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a  SYMLINKS 100../*
1390: 20 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65   Always cast the
13a0: 20 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e   getpid() return
13b0: 20 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74   type for compat
13c0: 69 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20  ibility with.** 
13d0: 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69  kernel modules i
13e0: 6e 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64  n VxWorks. */.#d
13f0: 65 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58  efine osGetpid(X
1400: 29 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28  ) (pid_t)getpid(
1410: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  )../*.** Only se
1420: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1430: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1440: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1450: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1460: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
1470: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
1480: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
1490: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
14a0: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
14b0: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
14c0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
14d0: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
14e0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
14f0: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
1500: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1510: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1520: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1530: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1540: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1550: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1560: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
1570: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1580: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
1590: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
15a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
15b0: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
15c0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
15d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
15e0: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
15f0: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
1600: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
1610: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1620: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1630: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1640: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1650: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1660: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
1670: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
1680: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
1690: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
16a0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
16b0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
16c0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
16d0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
16e0: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
16f0: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
1700: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
1710: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1720: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1730: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1740: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1770: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
1780: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
1790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
17a0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
17b0: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
17c0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
17d0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
17e0: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
17f0: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
1800: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
1810: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1820: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1830: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1840: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1850: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1860: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
1870: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
1880: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1890: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
18a0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
18b0: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
18c0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
18d0: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
18e0: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
18f0: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  t entry */.  sql
1900: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74   /* The VFS that
1930: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e   created this un
1940: 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  ixFile */.  unix
1950: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1960: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1970: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f  /* Info about lo
1980: 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  cks on this inod
1990: 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19c0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19d0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
19e0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
19f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a00: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
1a10: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1a20: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  /.  unsigned sho
1a30: 72 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  rt int ctrlFlags
1a40: 3b 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76  ;       /* Behav
1a50: 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49  ioral bits.  UNI
1a60: 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
1a70: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1aa0: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1ab0: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1ac0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1ad0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1ae0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1af0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1b00: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1b10: 6e 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c  nusedFd *pPreall
1b20: 6f 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f  ocatedUnused;  /
1b30: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1b40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1b50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1b60: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1b70: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1b90: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1bc0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1bd0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
1be0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1c10: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1c20: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1c30: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1c40: 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74  .  int nFetchOut
1c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c70: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1c80: 78 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20  xFetch refs */. 
1c90: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1ca0: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mapSize;        
1cb0: 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73       /* Usable s
1cc0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1cd0: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1ce0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1cf0: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1d00: 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20        /* Actual 
1d10: 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  size of mapping 
1d20: 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f  at pMapRegion */
1d30: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d40: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
1d50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
1d60: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
1d70: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20  SIZE value */.  
1d80: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
1d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
1db0: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23  pped region */.#
1dc0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74  endif.  int sect
1dd0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1df0: 65 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a  evice sector siz
1e00: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63  e */.  int devic
1e10: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1e20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ;          /* Pr
1e30: 65 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65  ecomputed device
1e40: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1e50: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
1e60: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e70: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1e80: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ea0: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1eb0: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1ec0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1ed0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1ee0: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1ef0: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f00: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1f30: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1f40: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1f50: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1f60: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
1f70: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
1f80: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
1f90: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1fb0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
1fc0: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
1fd0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
1fe0: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
1ff0: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2000: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
2010: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
2020: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
2030: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
2040: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
2050: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
2060: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2070: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2080: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2090: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
20a0: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
20b0: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
20c0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
20d0: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
20e0: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
20f0: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2100: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
2110: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
2120: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
2130: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
2140: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
2150: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
2160: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2170: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2180: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2190: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
21a0: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
21b0: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
21c0: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
21d0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
21e0: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
21f0: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2200: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
2210: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
2220: 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23  on */..#endif..#
2230: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2240: 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d  T.  /* In test m
2250: 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ode, increase th
2260: 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73  e size of this s
2270: 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73  tructure a bit s
2280: 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20  o that .  ** it 
2290: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
22a0: 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46  he struct CrashF
22b0: 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  ile defined in t
22c0: 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63  est6.c..  */.  c
22d0: 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d  har aPadding[32]
22e0: 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20  ;.#endif.};../* 
22f0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f  This variable ho
2300: 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20  lds the process 
2310: 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68  id (pid) from wh
2320: 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  en the xRandomne
2330: 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77  ss().** method w
2340: 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78  as called.  If x
2350: 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  Open() is called
2360: 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e   from a differen
2370: 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a  t process id,.**
2380: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2390: 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63   a fork() has oc
23a0: 63 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47  curred, the PRNG
23b0: 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a   will be reset..
23c0: 2a 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20  */.static pid_t 
23d0: 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
23e0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  0;../*.** Allowe
23f0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
2400: 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c   unixFile.ctrlFl
2410: 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a  ags bitmask:.*/.
2420: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2430: 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30  _EXCL        0x0
2440: 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  1     /* Connect
2450: 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72  ions from one pr
2460: 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64  ocess only */.#d
2470: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52  efine UNIXFILE_R
2480: 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20  DONLY      0x02 
2490: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
24a0: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30  LE_PERSIST_WAL 0
24d0: 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69  x04     /* Persi
24e0: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
24f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2500: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
2510: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
2520: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2530: 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74  08     /* Direct
2540: 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20  ory sync needed 
2550: 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  */.#else.# defin
2560: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
2570: 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69  NC    0x00.#endi
2580: 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  f.#define UNIXFI
2590: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30  LE_PSOW        0
25a0: 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  x10     /* SQLIT
25b0: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
25c0: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23  E_OVERWRITE */.#
25d0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
25e0: 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30  DELETE      0x20
25f0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f       /* Delete o
2600: 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69  n close */.#defi
2610: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20  ne UNIXFILE_URI 
2620: 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20          0x40    
2630: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67   /* Filename mig
2640: 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61  ht have query pa
2650: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66  rameters */.#def
2660: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  ine UNIXFILE_NOL
2670: 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20  OCK      0x80   
2680: 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20    /* Do no file 
2690: 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a  locking */../*.*
26a0: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
26b0: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
26c0: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
26d0: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
26e0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
26f0: 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75  ** Define variou
2700: 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72  s macros that ar
2710: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73  e missing from s
2720: 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ome systems..*/.
2730: 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  #ifndef O_LARGEF
2740: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
2750: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
2760: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2770: 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e  DISABLE_LFS.# un
2780: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2790: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
27a0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
27b0: 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  fndef O_NOFOLLOW
27c0: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f  .# define O_NOFO
27d0: 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69  LLOW 0.#endif.#i
27e0: 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23  fndef O_BINARY.#
27f0: 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59   define O_BINARY
2800: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2810: 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61   The threadid ma
2820: 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20  cro resolves to 
2830: 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72  the thread-id or
2840: 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72   to 0.  Used for
2850: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2860: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
2870: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  */.#if SQLITE_TH
2880: 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65  READSAFE.#define
2890: 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61   threadid pthrea
28a0: 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23  d_self().#else.#
28b0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
28c0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
28d0: 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61  HAVE_MREMAP defa
28e0: 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20  ults to true on 
28f0: 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20  Linux and false 
2900: 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e  everywhere else.
2910: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
2920: 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20  (HAVE_MREMAP).# 
2930: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
2940: 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
2950: 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20  (_GNU_SOURCE).# 
2960: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
2970: 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20  MAP 1.# else.#  
2980: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2990: 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e  AP 0.# endif.#en
29a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69  dif../*.** Expli
29b0: 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36  citly call the 6
29c0: 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66  4-bit version of
29d0: 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72   lseek() on Andr
29e0: 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  oid. Otherwise, 
29f0: 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68  lseek().** is th
2a00: 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e  e 32-bit version
2a10: 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f  , even if _FILE_
2a20: 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69  OFFSET_BITS=64 i
2a30: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
2a40: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
2a50: 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20  .# define lseek 
2a60: 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a  lseek64.#endif..
2a70: 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
2a80: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65  ./*.** Linux-spe
2a90: 63 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69  cific IOCTL magi
2aa0: 63 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66  c numbers used f
2ab0: 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46  or controlling F
2ac0: 32 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  2FS.*/.#define F
2ad0: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20  2FS_IOCTL_MAGIC 
2ae0: 20 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66         0xf5.#def
2af0: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41  ine F2FS_IOC_STA
2b00: 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RT_ATOMIC_WRITE 
2b10: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b20: 54 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65  TL_MAGIC, 1).#de
2b30: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f  fine F2FS_IOC_CO
2b40: 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54  MMIT_ATOMIC_WRIT
2b50: 45 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  E    _IO(F2FS_IO
2b60: 43 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64  CTL_MAGIC, 2).#d
2b70: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53  efine F2FS_IOC_S
2b80: 54 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  TART_VOLATILE_WR
2b90: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2ba0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23  OCTL_MAGIC, 3).#
2bb0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2bc0: 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57  ABORT_VOLATILE_W
2bd0: 52 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f  RITE   _IO(F2FS_
2be0: 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a  IOCTL_MAGIC, 5).
2bf0: 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43  #define F2FS_IOC
2c00: 5f 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20  _GET_FEATURES   
2c10: 20 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46          _IOR(F2F
2c20: 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31  S_IOCTL_MAGIC, 1
2c30: 32 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20  2, u32).#define 
2c40: 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f  F2FS_FEATURE_ATO
2c50: 4d 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34  MIC_WRITE 0x0004
2c60: 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
2c70: 75 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  ux__ */.../*.** 
2c80: 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73  Different Unix s
2c90: 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f  ystems declare o
2ca0: 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65  pen() in differe
2cb0: 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75  nt ways.  Same u
2cc0: 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74  se.** open(const
2cd0: 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f   char*,int,mode_
2ce0: 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20  t).  Others use 
2cf0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a  open(const char*
2d00: 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68  ,int,...)..** Th
2d10: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
2d20: 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75  important when u
2d30: 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74  sing a pointer t
2d40: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
2d50: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74  **.** The safest
2d60: 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74   way to deal wit
2d70: 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  h the problem is
2d80: 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74   to always use t
2d90: 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77  his wrapper.** w
2da0: 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20  hich always has 
2db0: 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65  the same well-de
2dc0: 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e  fined interface.
2dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2de0: 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63  osixOpen(const c
2df0: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20  har *zFile, int 
2e00: 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29  flags, int mode)
2e10: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28  {.  return open(
2e20: 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f  zFile, flags, mo
2e30: 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  de);.}../* Forwa
2e40: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
2e50: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
2e60: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
2e70: 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61  har*, int*);.sta
2e80: 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70  tic int unixGetp
2e90: 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a  agesize(void);..
2ea0: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
2eb0: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
2ec0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
2ed0: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
2ee0: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
2ef0: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
2f00: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
2f10: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
2f20: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
2f30: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
2f40: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
2f50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
2f60: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
2f70: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
2f80: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
2f90: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
2fa0: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
2fb0: 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63  struct unix_sysc
2fc0: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
2fd0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
2fe0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ff0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3000: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
3010: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
3020: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
3030: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
3040: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
3050: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3060: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
3070: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
3080: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
3090: 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20    { "open",     
30a0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
30b0: 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70  call_ptr)posixOp
30c0: 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69  en,  0  },.#defi
30d0: 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28  ne osOpen      (
30e0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
30f0: 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79  ar*,int,int))aSy
3100: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
3110: 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c  t)..  { "close",
3120: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3130: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f  _syscall_ptr)clo
3140: 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  se,      0  },.#
3150: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20  define osClose  
3160: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29     ((int(*)(int)
3170: 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75  )aSyscall[1].pCu
3180: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63  rrent)..  { "acc
3190: 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ess",       (sql
31a0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
31b0: 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20  )access,     0  
31c0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63  },.#define osAcc
31d0: 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28  ess    ((int(*)(
31e0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
31f0: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
3200: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3210: 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c  cwd",       (sql
3220: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3230: 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20  )getcwd,     0  
3240: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
3250: 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a  cwd    ((char*(*
3260: 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29  )(char*,size_t))
3270: 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72  aSyscall[3].pCur
3280: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74  rent)..  { "stat
3290: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
32a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
32b0: 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d  stat,       0  }
32c0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74  ,.#define osStat
32d0: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
32e0: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
32f0: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
3300: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
3310: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
3320: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
3330: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
3340: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
3350: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
3360: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
3370: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
3380: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
3390: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
33a0: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
33b0: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
33c0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
33d0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
33e0: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
33f0: 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61   it is DOS - wha
3400: 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74  t did you expect
3410: 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a  ?.*/.#ifdef __DJ
3420: 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74  GPP__.  { "fstat
3430: 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ",        0,    
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
3450: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74  },.#define osFst
3460: 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23  at(a,b,c)    0.#
3470: 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66  else     .  { "f
3480: 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73  stat",        (s
3490: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34a0: 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30  tr)fstat,      0
34b0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
34c0: 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a  stat     ((int(*
34d0: 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61  )(int,struct sta
34e0: 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e  t*))aSyscall[5].
34f0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
3500: 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65  ..  { "ftruncate
3510: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3520: 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e  yscall_ptr)ftrun
3530: 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65  cate,  0  },.#de
3540: 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65  fine osFtruncate
3550: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66   ((int(*)(int,of
3560: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  f_t))aSyscall[6]
3570: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3580: 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20  "fcntl",        
3590: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
35a0: 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20  _ptr)fcntl,     
35b0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
35c0: 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74  sFcntl     ((int
35d0: 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29  (*)(int,int,...)
35e0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
35f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
3600: 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  d",         (sql
3610: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3620: 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20  )read,       0  
3630: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
3640: 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  d      ((ssize_t
3650: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
3660: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38  ze_t))aSyscall[8
3670: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3680: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3690: 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  AD) || SQLITE_EN
36a0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36b0: 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  LE.  { "pread", 
36c0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36d0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61  syscall_ptr)prea
36e0: 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65  d,      0  },.#e
36f0: 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  lse.  { "pread",
3700: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3710: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3720: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3730: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
3740: 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a  Pread     ((ssiz
3750: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
3760: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61  ,size_t,off_t))a
3770: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
3780: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3790: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
37a0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37c0: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c  all_ptr)pread64,
37d0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
37e0: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
37f0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3800: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3810: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3820: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
3830: 64 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  d64 ((ssize_t(*)
3840: 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f  (int,void*,size_
3850: 74 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63  t,off64_t))aSysc
3860: 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74  all[10].pCurrent
3870: 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20  )..  { "write", 
3880: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3890: 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74  syscall_ptr)writ
38a0: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
38b0: 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20  efine osWrite   
38c0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
38d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
38e0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
38f0: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3900: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3910: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3920: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3930: 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65  TYLE.  { "pwrite
3940: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3950: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
3960: 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a  rite,     0  },.
3970: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
3980: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
3990: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
39a0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
39b0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
39c0: 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73  osPwrite    ((ss
39d0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
39e0: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
39f0: 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20  off_t))\.       
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79               aSy
3a10: 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65  scall[12].pCurre
3a20: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3a30: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3a40: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a60: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c  ll_ptr)pwrite64,
3a70: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
3a80: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
3a90: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3aa0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3ab0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3ac0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
3ad0: 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e64  ((ssize_t(*
3ae0: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
3af0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74  *,size_t,off64_t
3b00: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
3b10: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
3b20: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
3b30: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
3b40: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3b50: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
3b60: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3b70: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3b80: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3b90: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3ba0: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3bb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3bc0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3bd0: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3be0: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3bf0: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3c00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c10: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
3c20: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
3c30: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3c40: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3c50: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3c70: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3c80: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3c90: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3ca0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3cb0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3cc0: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3cd0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3ce0: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3cf0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3d00: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
3d10: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3d20: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3d30: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
3d40: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
3d50: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
3d60: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3d70: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3d80: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3d90: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3da0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3db0: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3dc0: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3dd0: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3de0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3df0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3e00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e10: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3e20: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3e30: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3e40: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3e50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3e60: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3e70: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3e80: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3e90: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3ea0: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3eb0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3ec0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3ed0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3ee0: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
3ef0: 4e 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c  N).  { "fchown",
3f00: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3f10: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f  syscall_ptr)fcho
3f20: 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  wn,          0 }
3f30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68  ,.#else.  { "fch
3f40: 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c  own",       (sql
3f50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3f60: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3f80: 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20  efine osFchown  
3f90: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75    ((int(*)(int,u
3fa0: 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73  id_t,gid_t))aSys
3fb0: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
3fc0: 74 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64  t)..  { "geteuid
3fd0: 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ",      (sqlite3
3fe0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
3ff0: 65 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20  euid,         0 
4000: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  },.#define osGet
4010: 65 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a  euid   ((uid_t(*
4020: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
4030: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
4040: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4050: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
4060: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
4070: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
4080: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4090: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
40a0: 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  )mmap,          
40b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
40c0: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20   "mmap",        
40d0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
40e0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
40f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4100: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  if.#define osMma
4110: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
4120: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
4130: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
4140: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
4150: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
4160: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
4170: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
4180: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
4190: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
41a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
41b0: 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20  l_ptr)munmap,   
41c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
41d0: 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20  e.  { "munmap", 
41e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
41f0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
4200: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4210: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
4220: 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a  osMunmap ((void*
4230: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
4240: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
4250: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41  Current)..#if HA
4260: 56 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21 64  VE_MREMAP && (!d
4270: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4280: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
4290: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
42a0: 30 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c  0).  { "mremap",
42b0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
42c0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d  syscall_ptr)mrem
42d0: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
42e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65  ,.#else.  { "mre
42f0: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
4300: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4310: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4320: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
4330: 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28  efine osMremap (
4340: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
4350: 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e  size_t,size_t,in
4360: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
4370: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
4380: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4390: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
43a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
43b0: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74 70  SIZE>0.  { "getp
43c0: 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69  agesize",  (sqli
43d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
43e0: 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c  unixGetpagesize,
43f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4400: 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20  "getpagesize",  
4410: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4420: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
4430: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4440: 66 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70  f.#define osGetp
4450: 61 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29  agesize ((int(*)
4460: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4470: 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  25].pCurrent)..#
4480: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
4490: 52 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72  READLINK).  { "r
44a0: 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73  eadlink",     (s
44b0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
44c0: 74 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20  tr)readlink,    
44d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
44e0: 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20   { "readlink",  
44f0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
4500: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
4510: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4520: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 52  ndif.#define osR
4530: 65 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f  eadlink ((ssize_
4540: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
4550: 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  ,char*,size_t))a
4560: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
4570: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4580: 65 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20  ed(HAVE_LSTAT). 
4590: 20 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20   { "lstat",     
45a0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
45b0: 63 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20  call_ptr)lstat, 
45c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
45d0: 6c 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c  lse.  { "lstat",
45e0: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
45f0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4610: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
4620: 65 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20 28  e osLstat      (
4630: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
4640: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
4650: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
4660: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 69  Current)..  { "i
4670: 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20 28  octl",         (
4680: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4690: 70 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20 20  ptr)ioctl,      
46a0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
46b0: 20 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a   osIoctl ((int(*
46c0: 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61  )(int,int,...))a
46d0: 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72  Syscall[28].pCur
46e0: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
46f0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
4700: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
4710: 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  s */.../*.** On 
4720: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
4730: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
4740: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
4750: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
4760: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
4770: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
4780: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
4790: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
47a0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
47b0: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
47c0: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
47d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
47e0: 75 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64  ustFchown(int fd
47f0: 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64  , uid_t uid, gid
4800: 5f 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65 66  _t gid){.#if def
4810: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
4820: 29 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74  ).  return osGet
4830: 65 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46  euid() ? 0 : osF
4840: 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64  chown(fd,uid,gid
4850: 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
4860: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
4870: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
4880: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
4890: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
48a0: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
48b0: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
48c0: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
48d0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
48e0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
48f0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
4900: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
4910: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
4920: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
4930: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
4940: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
4950: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
4960: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
4970: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
4980: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
4990: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
49a0: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
49b0: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
49c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
49d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
49e0: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
49f0: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
4a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
4a10: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
4a20: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
4a30: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
4a40: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
4a50: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4a60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4a70: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
4a80: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4a90: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
4aa0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
4ab0: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
4ac0: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
4ad0: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
4ae0: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
4af0: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
4b00: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
4b10: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
4b20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4b30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
4b40: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4b50: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4b60: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
4b70: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4b80: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
4b90: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
4ba0: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
4bb0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
4bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
4be0: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
4bf0: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
4c00: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
4c10: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
4c20: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
4c30: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
4c40: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
4c50: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
4c60: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
4c70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
4c80: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
4c90: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
4ca0: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
4cb0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
4cc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4cd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4ce0: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
4cf0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
4d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
4d10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4d20: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
4d30: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
4d40: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
4d50: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4d60: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
4d70: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
4d80: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
4d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4da0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4dc0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
4dd0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
4de0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
4df0: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
4e00: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
4e10: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
4e20: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
4e30: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
4e40: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
4e50: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
4e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
4e70: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
4e80: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
4e90: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
4ea0: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
4eb0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
4ec0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
4ed0: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
4ee0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
4ef0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4f00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
4f10: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
4f20: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4f30: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
4f40: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4f50: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
4f60: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4f70: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
4f80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4f90: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
4fa0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
4fb0: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
4fc0: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
4fd0: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
4fe0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
4ff0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
5000: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
5010: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
5020: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
5030: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
5040: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
5050: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
5060: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
5070: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5080: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
5090: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
50a0: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
50b0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
50c0: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
50d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
50e0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
50f0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5100: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
5110: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
5120: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
5130: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
5140: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
5150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5160: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
5170: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
5180: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
5190: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
51a0: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
51b0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
51c0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
51d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e  0;.}../*.** Do n
51e0: 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69  ot accept any fi
51f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65  le descriptor le
5200: 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  ss than this val
5210: 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ue, in order to 
5220: 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67  avoid.** opening
5230: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
5240: 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69  sing file descri
5250: 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63  ptors that are c
5260: 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  ommonly used for
5270: 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e   .** standard in
5280: 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64  put, output, and
5290: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64   error..*/.#ifnd
52a0: 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ef SQLITE_MINIMU
52b0: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
52c0: 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  R.# define SQLIT
52d0: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
52e0: 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64  ESCRIPTOR 3.#end
52f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  if../*.** Invoke
5300: 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20   open().  Do so 
5310: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
5320: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
5330: 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66  succeeds or.** f
5340: 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65  ails for some re
5350: 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  ason other than 
5360: 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EINTR..**.** If 
5370: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
5380: 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20  n mode "m" is 0 
5390: 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74  then set it to t
53a0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a  he default for.*
53b0: 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64  * SQLite.  The d
53c0: 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45  efault is SQLITE
53d0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
53e0: 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61  RMISSIONS (norma
53f0: 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20  lly.** 0644) as 
5400: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
5410: 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49  system umask.  I
5420: 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  f m is not 0, th
5430: 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66  en.** make the f
5440: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
5450: 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69  e be exactly m i
5460: 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73  gnoring the umas
5470: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70  k..**.** The m p
5480: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65  arameter will be
5490: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77   non-zero only w
54a0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61  hen creating -wa
54b0: 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  l, -journal,.** 
54c0: 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20  and -shm files. 
54d0: 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66   We want those f
54e0: 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78  iles to have *ex
54f0: 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a  actly* the same.
5500: 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ** permissions a
5510: 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  s their original
5520: 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75   database, unadu
5530: 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20  lterated by the 
5540: 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61  umask..** In tha
5550: 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61  t way, if a data
5560: 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77  base file is -rw
5570: 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77  -rw-rw or -rw-rw
5580: 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72  -r-, and a.** tr
5590: 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65  ansaction crashe
55a0: 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68  s and leaves beh
55b0: 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  ind hot journals
55c0: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72  , then any.** pr
55d0: 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62  ocess that is ab
55e0: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
55f0: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
5600: 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f   also be able to
5610: 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20  .** recover the 
5620: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f  hot journals..*/
5630: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
5640: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
5650: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f  ar *z, int f, mo
5660: 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66  de_t m){.  int f
5670: 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d  d;.  mode_t m2 =
5680: 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f   m ? m : SQLITE_
5690: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
56a0: 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c  MISSIONS;.  whil
56b0: 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  e(1){.#if define
56c0: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20  d(O_CLOEXEC).   
56d0: 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66   fd = osOpen(z,f
56e0: 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a  |O_CLOEXEC,m2);.
56f0: 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f  #else.    fd = o
5700: 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23  sOpen(z,f,m2);.#
5710: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64  endif.    if( fd
5720: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
5730: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63  errno==EINTR ) c
5740: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62  ontinue;.      b
5750: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5760: 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d  if( fd>=SQLITE_M
5770: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
5780: 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a  RIPTOR ) break;.
5790: 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b      osClose(fd);
57a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
57b0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
57c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
57d0: 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70    "attempt to op
57e0: 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c  en \"%s\" as fil
57f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22  e descriptor %d"
5800: 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64  , z, fd);.    fd
5810: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f   = -1;.    if( o
5820: 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c  sOpen("/dev/null
5830: 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65  ", f, m)<0 ) bre
5840: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  ak;.  }.  if( fd
5850: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  >=0 ){.    if( m
5860: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  !=0 ){.      str
5870: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
5880: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
5890: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
58a0: 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
58b0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
58c0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74  =0.       && (st
58d0: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37  atbuf.st_mode&07
58e0: 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b  77)!=m .      ){
58f0: 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f  .        osFchmo
5900: 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20  d(fd, m);.      
5910: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  }.    }.#if defi
5920: 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20  ned(FD_CLOEXEC) 
5930: 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43  && (!defined(O_C
5940: 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f  LOEXEC) || O_CLO
5950: 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46  EXEC==0).    osF
5960: 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
5970: 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
5980: 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
5990: 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
59a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b    }.  return fd;
59b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
59c0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
59d0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
59e0: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
59f0: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
5a00: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
5a10: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
5a20: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
5a30: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
5a40: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
5a50: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
5a60: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
5a70: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
5a80: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
5a90: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
5aa0: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
5ab0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
5ac0: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
5ad0: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
5ae0: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
5af0: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
5b00: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
5b10: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
5b20: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
5b30: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
5b40: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
5b50: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
5b60: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
5b70: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
5b80: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
5b90: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
5ba0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
5bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5bc0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
5bd0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
5be0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53  MUTEX_STATIC_VFS
5bf0: 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  1));.}.static vo
5c00: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
5c10: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
5c20: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
5c30: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5c40: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5c50: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5c60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5c70: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
5c80: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
5c90: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
5ca0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5cb0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
5cc0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
5cd0: 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
5ce0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
5cf0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
5d00: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  RACE./*.** Helpe
5d10: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
5d20: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
5d30: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
5d40: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
5d50: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
5d60: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
5d70: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5d80: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
5d90: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
5da0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5db0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
5dc0: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
5dd0: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
5de0: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
5df0: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
5e00: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
5e10: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
5e20: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
5e30: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
5e40: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
5e50: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
5e60: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
5e70: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
5e80: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
5e90: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
5ea0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5eb0: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5ec0: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5ed0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5ee0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5ef0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
5f00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5f10: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
5f20: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
5f30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5f40: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
5f50: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
5f60: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
5f70: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
5f80: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
5f90: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
5fa0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5fb0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
5fc0: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
5fd0: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
5fe0: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
5ff0: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
6000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
6010: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
6020: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
6030: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
6040: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
6050: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
6060: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
6070: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
6080: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
6090: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
60a0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
60b0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
60c0: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
60d0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
60e0: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
60f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
6100: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
6110: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
6120: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
6130: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
6140: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
6150: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
6160: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
6170: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
6180: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
6190: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
61a0: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
61b0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
61c0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
61d0: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
61e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
61f0: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
6200: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
6210: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
6220: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
6230: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
6240: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
6250: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
6260: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
6270: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
6280: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
6290: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
62a0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
62b0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
62c0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
62d0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
62e0: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
62f0: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
6300: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
6310: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
6320: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
6330: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
6340: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
6350: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
6360: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
6370: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
6380: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
6390: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
63a0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
63b0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
63c0: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
63d0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
63e0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
63f0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
6400: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
6410: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
6420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6430: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
6440: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
6450: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
6460: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
6470: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
6480: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
6490: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
64a0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
64b0: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
64c0: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
64d0: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
64e0: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
64f0: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
6500: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
6510: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6520: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
6530: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
6540: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
6550: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
6560: 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61  NTR.**.** All ca
6570: 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65  lls to ftruncate
6580: 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  () within this f
6590: 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ile should be ma
65a0: 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  de through.** th
65b0: 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20  is wrapper.  On 
65c0: 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74  the Android plat
65d0: 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20  form, bypassing 
65e0: 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a  the logic below.
65f0: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
6600: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
6610: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
6620: 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  nt robust_ftrunc
6630: 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74  ate(int h, sqlit
6640: 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20  e3_int64 sz){.  
6650: 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
6660: 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20  _ANDROID__.  /* 
6670: 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75  On Android, ftru
6680: 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75  ncate() always u
6690: 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65  ses 32-bit offse
66a0: 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a  ts, even if .  *
66b0: 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42  * _FILE_OFFSET_B
66c0: 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65  ITS=64 is define
66d0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74  d. This means it
66e0: 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74   is unsafe to at
66f0: 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72  tempt to.  ** tr
6700: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
6710: 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72   any size larger
6720: 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65   than 2GiB. Sile
6730: 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a  ntly ignore any.
6740: 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70    ** such attemp
6750: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a  ts.  */.  if( sz
6760: 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  >(sqlite3_int64)
6770: 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20  0x7FFFFFFF ){.  
6780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6790: 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
67a0: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
67b0: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
67c0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
67d0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
67e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
67f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6800: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
6810: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
6820: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
6830: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
6840: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
6850: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
6860: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
6870: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
6880: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
6890: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
68a0: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
68b0: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
68c0: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
68d0: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
68e0: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
68f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6900: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
6910: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
6920: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
6930: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
6940: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
6950: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
6960: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
6970: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
6980: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
6990: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
69a0: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
69b0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
69c0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
69d0: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
69e0: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
69f0: 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20  rr) {.  assert( 
6a00: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6a10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
6a20: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  K) || .         
6a30: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6a40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
6a50: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
6a60: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
6a70: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6a80: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20  _RDLOCK) ||.    
6a90: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
6aa0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6ab0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
6ac0: 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63  LOCK) );.  switc
6ad0: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
6ae0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
6af0: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
6b00: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
6b10: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
6b20: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
6b30: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
6b40: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
6b50: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
6b60: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6b70: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6b80: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
6b90: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
6ba0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6bb0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6bc0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
6bd0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
6be0: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
6bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c00: 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66  PERM;.    .  def
6c10: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
6c20: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
6c30: 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
6ca0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
6cb0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
6cc0: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
6cd0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
6ce0: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
6cf0: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
6d00: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
6d10: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
6d20: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
6d30: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
6d40: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
6d50: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
6d60: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
6d70: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
6d80: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
6d90: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
6da0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
6db0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6dc0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
6dd0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
6de0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
6df0: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
6e00: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
6e10: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
6e20: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
6e30: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
6e40: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
6e50: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
6e60: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
6e70: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
6e80: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
6e90: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
6ea0: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
6eb0: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
6ec0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6ed0: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
6ee0: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
6ef0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
6f00: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
6f10: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
6f20: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
6f30: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
6f40: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
6f50: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
6f60: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
6f70: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
6f80: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
6f90: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
6fa0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6fb0: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
6fc0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
6fd0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
6fe0: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
6ff0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
7000: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
7010: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7020: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
7030: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
7040: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7060: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
7070: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
7080: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
7090: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
70a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
70b0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
70c0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
70d0: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
70e0: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
70f0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
7100: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
7110: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
7120: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
7130: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
7140: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
7150: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
7160: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
7170: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
7180: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
7190: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
71a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
71b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
71c0: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
71d0: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
71e0: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
71f0: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
7200: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
7210: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
7220: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
7230: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
7240: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
7250: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
7260: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
7270: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
7280: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
7290: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
72a0: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
72b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
72c0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
72d0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
72e0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
72f0: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
7300: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
7310: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
7320: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
7330: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
7340: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
7350: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
7360: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
7370: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
7380: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
7390: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
73a0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
73b0: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
73c0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
73d0: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
73e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
73f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
7400: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
7410: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
7420: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
7430: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
7440: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
7450: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
7460: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
7470: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7480: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
7490: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
74a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
74b0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
74c0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
74d0: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
74e0: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
74f0: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
7500: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
7510: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
7520: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7530: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
7540: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
7550: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
7560: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
7570: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
7580: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
7590: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
75a0: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
75b0: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
75c0: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
75d0: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
75e0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
75f0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
7600: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
7610: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
7620: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
7630: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
7640: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
7650: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
7660: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
7670: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7680: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
7690: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
76a0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
76b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
76c0: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
76d0: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
76e0: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
76f0: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
7700: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
7710: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
7720: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
7730: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
7740: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7770: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
7780: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
7790: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
77a0: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
77b0: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
77c0: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
77d0: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
77e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
77f0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
7800: 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20   (n+1) );.  if( 
7810: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7820: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e   0;.  pNew->zCan
7830: 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68  onicalName = (ch
7840: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
7850: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61  memcpy(pNew->zCa
7860: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62  nonicalName, zAb
7870: 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29  soluteName, n+1)
7880: 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53  ;.  n = vxworksS
7890: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77  implifyName(pNew
78a0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
78b0: 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  , n);..  /* Sear
78c0: 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
78d0: 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  ng entry that ma
78e0: 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e  tching the canon
78f0: 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  ical name..  ** 
7900: 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d  If found, increm
7910: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
7920: 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75  e count and retu
7930: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
7940: 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e    ** the existin
7950: 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a  g file ID..  */.
7960: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
7970: 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69  ();.  for(pCandi
7980: 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65  date=vxworksFile
7990: 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65  List; pCandidate
79a0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61  ; pCandidate=pCa
79b0: 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b  ndidate->pNext){
79c0: 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64  .    if( pCandid
79d0: 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20  ate->nName==n . 
79e0: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43      && memcmp(pC
79f0: 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e  andidate->zCanon
7a00: 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  icalName, pNew->
7a10: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7a20: 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  n)==0.    ){.   
7a30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7a40: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70  (pNew);.       p
7a50: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b  Candidate->nRef+
7a60: 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65  +;.       unixLe
7a70: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
7a80: 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69     return pCandi
7a90: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  date;.    }.  }.
7aa0: 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77  .  /* No match w
7ab0: 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69  as found.  We wi
7ac0: 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69  ll make a new fi
7ad0: 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d  le ID */.  pNew-
7ae0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  >nRef = 1;.  pNe
7af0: 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20  w->nName = n;.  
7b00: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78  pNew->pNext = vx
7b10: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20  worksFileList;. 
7b20: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
7b30: 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c   = pNew;.  unixL
7b40: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
7b50: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
7b60: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
7b70: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7b80: 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46  nt on a vxworksF
7b90: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46  ileId object.  F
7ba0: 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ree.** the objec
7bb0: 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  t when the refer
7bc0: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
7bd0: 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  es zero..*/.stat
7be0: 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52  ic void vxworksR
7bf0: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72  eleaseFileId(str
7c00: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7c10: 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45  d *pId){.  unixE
7c20: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
7c30: 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66  ssert( pId->nRef
7c40: 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65  >0 );.  pId->nRe
7c50: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e  f--;.  if( pId->
7c60: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
7c70: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7c80: 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f  eId **pp;.    fo
7c90: 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c  r(pp=&vxworksFil
7ca0: 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70  eList; *pp && *p
7cb0: 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28  p!=pId; pp = &((
7cc0: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a  *pp)->pNext)){}.
7cd0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d      assert( *pp=
7ce0: 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20  =pId );.    *pp 
7cf0: 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pId->pNext;.  
7d00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7d10: 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Id);.  }.  unixL
7d20: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23  eaveMutex();.}.#
7d30: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
7d40: 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RKS */./********
7d50: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55  ******* End of U
7d60: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
7d70: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
7d80: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
7d90: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e10: 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 50 6f 73 69 78 20 41 64 76 69 73  **** Posix Advis
7e60: 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ory Locking ****
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 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
7e90: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
7ea0: 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62  cks are broken b
7eb0: 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20  y design.  ANSI 
7ec0: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
7ed0: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
7ee0: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
7ef0: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
7f00: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
7f10: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
7f20: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
7f30: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
7f40: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
7f50: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
7f60: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
7f70: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
7f80: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
7f90: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
7fa0: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
7fb0: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
7fc0: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
7fd0: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
7fe0: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
7ff0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
8000: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
8010: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
8020: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
8030: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
8040: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
8050: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
8060: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
8070: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
8080: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
8090: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
80a0: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
80b0: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
80c0: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
80d0: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
80e0: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
80f0: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
8100: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
8110: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
8120: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
8130: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
8140: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
8150: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
8160: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
8170: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
8180: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
8190: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
81a0: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
81b0: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
81c0: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
81d0: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
81e0: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
81f0: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
8200: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
8210: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
8220: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
8230: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
8240: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
8250: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
8260: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
8270: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
8280: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  e names..**.** T
8290: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
82a0: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
82b0: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
82c0: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
82d0: 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d  ess.** among com
82e0: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
82f0: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
8300: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
8310: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
8320: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
8330: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
8340: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
8350: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
8360: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
8370: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
8380: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
8390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
83a0: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
83b0: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
83c0: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
83d0: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
83e0: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
83f0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
8400: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
8410: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
8420: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
8430: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8440: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
8450: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
8460: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
8470: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
8480: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
8490: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
84a0: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
84b0: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
84c0: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
84d0: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
84e0: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
84f0: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
8500: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
8510: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
8520: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
8530: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
8540: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
8550: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
8560: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
8570: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
8580: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
8590: 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65  *.** (Aside: The
85a0: 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75   use of inode nu
85b0: 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20  mbers as unique 
85c0: 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  IDs does not wor
85d0: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
85e0: 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65   For VxWorks, we
85f0: 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65   have to use the
8600: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69   alternative uni
8610: 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61  que ID system ba
8620: 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69  sed on.** canoni
8630: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  cal filename and
8640: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
8650: 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76  the previous div
8660: 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ision.).**.** Th
8670: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
8680: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
8690: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
86a0: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
86b0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
86c0: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
86d0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
86e0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
86f0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
8700: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
8710: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
8720: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
8730: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
8740: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
8750: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
8760: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
8770: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8780: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
8790: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
87a0: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
87b0: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
87c0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
87d0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
87e0: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
87f0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
8800: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
8810: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
8820: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
8830: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
8840: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
8850: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
8860: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
8870: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
8880: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
8890: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
88a0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
88b0: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
88c0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
88d0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
88e0: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
88f0: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
8900: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
8910: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
8920: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
8930: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
8940: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
8950: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
8960: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
8970: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
8980: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
8990: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
89a0: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
89b0: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
89c0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
89d0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
89e0: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
89f0: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
8a00: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a  .**.** But wait:
8a10: 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20    there are yet 
8a20: 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69  more problems wi
8a30: 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  th POSIX advisor
8a40: 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  y locks..**.** I
8a50: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
8a60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
8a70: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
8a80: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
8a90: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
8aa0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
8ab0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
8ac0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
8ad0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
8ae0: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
8af0: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
8b00: 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64  m, each unixInod
8b10: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  eInfo object.** 
8b20: 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e  maintains a coun
8b30: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8b40: 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73  of pending locks
8b50: 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a   on tha inode..*
8b60: 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  * When an attemp
8b70: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f  t is made to clo
8b80: 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20  se an unixFile, 
8b90: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
8ba0: 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f  other unixFile o
8bb0: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
8bc0: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
8bd0: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
8be0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
8bf0: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
8c00: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
8c10: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
8c20: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
8c30: 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e  r..** The unixIn
8c40: 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  odeInfo structur
8c50: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
8c60: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
8c70: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
8c80: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
8c90: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
8ca0: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
8cb0: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
8cc0: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
8cd0: 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68  .**.** Yet anoth
8ce0: 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e  er problem:  Lin
8cf0: 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74  uxThreads do not
8d00: 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
8d10: 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  posix locks..**.
8d20: 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65  ** Many older ve
8d30: 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20  rsions of linux 
8d40: 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72  use the LinuxThr
8d50: 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69  eads library whi
8d60: 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73  ch is.** not pos
8d70: 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55  ix compliant.  U
8d80: 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64  nder LinuxThread
8d90: 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  s, a lock create
8da0: 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41  d by thread.** A
8db0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
8dc0: 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65  ied or overridde
8dd0: 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  n by a different
8de0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
8df0: 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ly thread A can 
8e00: 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e  modify the lock.
8e10: 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69    Locking behavi
8e20: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a  or is correct.**
8e30: 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69   if the appliati
8e40: 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65  on uses the newe
8e50: 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54  r Native Posix T
8e60: 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e  hread Library (N
8e70: 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78  PTL).** on linux
8e80: 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c   - with NPTL a l
8e90: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
8ea0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8eb0: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e  ride locks.** in
8ec0: 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20   thread B.  But 
8ed0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
8ee0: 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  to know at compi
8ef0: 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a  le-time which.**
8f00: 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61   threading libra
8f10: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
8f20: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
8f30: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8f40: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  .** compile-time
8f50: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
8f60: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
8f70: 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  rride locks on t
8f80: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20  hread B..** One 
8f90: 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d  has to do a run-
8fa0: 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69  time check to di
8fb0: 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76  scover the behav
8fc0: 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ior of the.** cu
8fd0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a  rrent process..*
8fe0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64  *.** SQLite used
8ff0: 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75   to support Linu
9000: 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73  xThreads.  But s
9010: 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78  upport for Linux
9020: 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64  Threads.** was d
9030: 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67  ropped beginning
9040: 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e   with version 3.
9050: 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c  7.0.  SQLite wil
9060: 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74  l still work wit
9070: 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64  h.** LinuxThread
9080: 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  s provided that 
9090: 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (1) there is no 
90a0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
90b0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72  nnection .** per
90c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
90d0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
90e0: 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62  ss and (2) datab
90f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
9100: 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61  ** do not move a
9110: 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a  cross threads..*
9120: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
9130: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
9140: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
9150: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
9160: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
9170: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
9180: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
9190: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
91a0: 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20   unixFileId {.  
91b0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
91d0: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
91e0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
91f0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9200: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20  ileId *pId;  /* 
9210: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  Unique file ID f
9220: 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23  or vxworks. */.#
9230: 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65  else.  /* We are
9240: 20 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20   told that some 
9250: 76 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72  versions of Andr
9260: 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75  oid contain a bu
9270: 67 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65  g that.  ** size
9280: 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20  s ino_t at only 
9290: 33 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20  32-bits instead 
92a0: 6f 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65  of 64-bits. (See
92b0: 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e  .  ** https://an
92c0: 64 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f  droid-review.goo
92d0: 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f  glesource.com/#/
92e0: 63 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f  c/115351/3/dist/
92f0: 73 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20  sqlite3.c).  ** 
9300: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
9310: 68 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f  his, always allo
9320: 63 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72  cate 64-bits for
9330: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
9340: 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61  r.  .  ** On sma
9350: 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74  ll machines that
9360: 20 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69   only have 32-bi
9370: 74 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77  t inodes, this w
9380: 61 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20  astes 4 bytes,. 
9390: 20 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f   ** but that sho
93a0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67  uld not be a big
93b0: 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57   deal. */.  /* W
93c0: 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  AS:  ino_t ino; 
93d0: 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20    */.  u64 ino; 
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
9400: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
9410: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
9420: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
9430: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
9440: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
9450: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
9460: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
9470: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
9480: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
9490: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
94a0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
94b0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
94c0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
94d0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
94e0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
94f0: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
9500: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
9510: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
9520: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9530: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9540: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
9550: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
9560: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
9570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
9580: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
9590: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
95a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
95b0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
95c0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
95d0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
95e0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
95f0: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
9600: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9610: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
9620: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
9630: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
9640: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ock;        /* O
9650: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
9660: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
9670: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67   etc. */.  unsig
9680: 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73  ned char bProces
9690: 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e  sLock;     /* An
96a0: 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65   exclusive proce
96b0: 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ss lock is held 
96c0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
96f0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
9700: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9710: 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
9720: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
9730: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
9740: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
9750: 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  th this inode */
9760: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9790: 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65  outstanding file
97a0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78   locks */.  Unix
97b0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
97c0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
97d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
97e0: 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20  iptors to close 
97f0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9800: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  fo *pNext;      
9810: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
9820: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
9830: 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75  o objects */.  u
9840: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50  nixInodeInfo *pP
9850: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
9860: 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79  *    .... doubly
9870: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53   linked */.#if S
9880: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
9890: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73  KING_STYLE.  uns
98a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
98b0: 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20  sharedByte;  /* 
98c0: 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65  for AFP simulate
98d0: 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  d shared lock */
98e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
98f0: 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a  XWORKS.  sem_t *
9900: 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pSem;           
9910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9920: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
9930: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
9940: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
9950: 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  E+2];  /* Name o
9960: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
9970: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
9980: 66 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f  f SQLITE_SHARED_
9990: 4d 41 50 50 49 4e 47 0a 20 20 73 71 6c 69 74 65  MAPPING.  sqlite
99a0: 33 5f 69 6e 74 36 34 20 6e 53 68 61 72 65 64 4d  3_int64 nSharedM
99b0: 61 70 70 69 6e 67 3b 20 20 20 2f 2a 20 53 69 7a  apping;   /* Siz
99c0: 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67 69  e of mapped regi
99d0: 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
99e0: 20 76 6f 69 64 20 2a 70 53 68 61 72 65 64 4d 61   void *pSharedMa
99f0: 70 70 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20  pping;          
9a00: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
9a10: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
9a20: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
9a30: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
9a40: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
9a50: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
9a60: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
9a70: 65 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41  eList = 0;  /* A
9a80: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9a90: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 73 74 61 74   objects */.stat
9aa0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
9ab0: 6e 55 6e 75 73 65 64 46 64 20 3d 20 30 3b 20 20  nUnusedFd = 0;  
9ac0: 20 20 2f 2a 20 54 6f 74 61 6c 20 75 6e 75 73 65    /* Total unuse
9ad0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
9ae0: 72 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20  rs */../*.**.** 
9af0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
9b00: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9b10: 6e 65 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76  ne(), is only ev
9b20: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
9b30: 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c  e macro.** unixL
9b40: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
9b50: 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61   It is invoked a
9b60: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
9b70: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
9b80: 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f  nction and errno
9b90: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74   has been.** set
9ba0: 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  . It logs a mess
9bb0: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
9bc0: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
9bd0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
9be0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f  alue of.** errno
9bf0: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
9c00: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
9c10: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
9c20: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
9c30: 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f   or.** strerror_
9c40: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  r()..**.** The f
9c50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9c60: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72  ssed to the macr
9c70: 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  o should be the 
9c80: 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a  error code that.
9c90: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ** will be retur
9ca0: 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65  ned to SQLite (e
9cb0: 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .g. SQLITE_IOERR
9cc0: 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f  _DELETE, SQLITE_
9cd0: 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54  CANTOPEN). .** T
9ce0: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
9cf0: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
9d00: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
9d10: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
9d20: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
9d30: 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c   (e.g. "unlink",
9d40: 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68 65   "open") and the
9d50: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
9d60: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a  -system path,.**
9d70: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
9d80: 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  ine unixLogError
9d90: 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69 78  (a,b,c)     unix
9da0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
9db0: 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,b,c,__LINE__).s
9dc0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
9dd0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
9de0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
9e10: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
9e20: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9e40: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
9e50: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
9e60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9e70: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
9e80: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
9e90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
9ea0: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
9eb0: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
9ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
9ed0: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
9ee0: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
9ef0: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
9f00: 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20 20  r *zErr;        
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f20: 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74 72  Message from str
9f30: 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69 76  error() or equiv
9f40: 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  alent */.  int i
9f50: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20  Errno = errno;  
9f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61             /* Sa
9f70: 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72 6f  ved syscall erro
9f80: 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f  r number */..  /
9f90: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
9fa0: 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75   a threadsafe bu
9fb0: 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52 45  ild (SQLITE_THRE
9fc0: 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e  ADSAFE==0), then
9fd0: 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   use.  ** the st
9fe0: 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69 6f  rerror() functio
9ff0: 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  n to obtain the 
a000: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
a010: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
a020: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
a030: 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  errno. Otherwise
a040: 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f 72  , use strerror_r
a050: 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51  ()..  */ .#if SQ
a060: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
a070: 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  && defined(HAVE_
a080: 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63 68  STRERROR_R).  ch
a090: 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d  ar aErr[80];.  m
a0a0: 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20 73  emset(aErr, 0, s
a0b0: 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20 20  izeof(aErr));.  
a0c0: 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20  zErr = aErr;..  
a0d0: 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f 52  /* If STRERROR_R
a0e0: 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79 20  _CHAR_P (set by 
a0f0: 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74 73  autoconf scripts
a100: 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69  ) or __USE_GNU i
a110: 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20  s defined,.  ** 
a120: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
a130: 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20  system provides 
a140: 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20  the GNU version 
a150: 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  of strerror_r() 
a160: 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  that.  ** return
a170: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a180: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
a190: 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
a1a0: 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e 74  sage. That point
a1b0: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69  er .  ** may poi
a1c0: 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72  nt to aErr[], or
a1d0: 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f   it may point to
a1e0: 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74 6f   some static sto
a1f0: 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e 20  rage somewhere. 
a200: 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
a210: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
a220: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
a230: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
a240: 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65  on of .  ** stre
a250: 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68 20  rror_r(), which 
a260: 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61 6e  always writes an
a270: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
a280: 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a  nto aErr[]..  **
a290: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 64  .  ** If the cod
a2a0: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61 73  e incorrectly as
a2b0: 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
a2c0: 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73 69   the POSIX versi
a2d0: 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  on that is.  ** 
a2e0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20 65  available, the e
a2f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
a300: 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65 6d  l often be an em
a310: 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20  pty string. Not 
a320: 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f 62  a.  ** huge prob
a330: 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79  lem. Incorrectly
a340: 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61 74   concluding that
a350: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
a360: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a 20   is available . 
a370: 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74   ** could lead t
a380: 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68 6f  o a segfault tho
a390: 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  ugh..  */.#if de
a3a0: 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f 52  fined(STRERROR_R
a3b0: 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66 69  _CHAR_P) || defi
a3c0: 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20  ned(__USE_GNU). 
a3d0: 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69 66   zErr = .# endif
a3e0: 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69 45  .  strerror_r(iE
a3f0: 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65  rrno, aErr, size
a400: 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65  of(aErr)-1);..#e
a410: 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  lif SQLITE_THREA
a420: 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73 20  DSAFE.  /* This 
a430: 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65 20  is a threadsafe 
a440: 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65 72  build, but strer
a450: 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20 61  ror_r() is not a
a460: 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a  vailable. */.  z
a470: 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a  Err = "";.#else.
a480: 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73    /* Non-threads
a490: 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20 73  afe build, use s
a4a0: 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20  trerror(). */.  
a4b0: 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72 28  zErr = strerror(
a4c0: 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a  iErrno);.#endif.
a4d0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
a4e0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
a4f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
a500: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75  ode,.      "os_u
a510: 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20 25  nix.c:%d: (%d) %
a520: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
a530: 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f     iLine, iErrno
a540: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
a550: 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zErr.  );..  ret
a560: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
a570: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
a580: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
a590: 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 74  *.** We assume t
a5a0: 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f  hat close() almo
a5b0: 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c  st always works,
a5c0: 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c   since it is onl
a5d0: 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73  y in a.** very s
a5e0: 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ick application 
a5f0: 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69 63  or on a very sic
a600: 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20  k platform that 
a610: 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a  it might fail..*
a620: 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61 69  * If it does fai
a630: 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74  l, simply leak t
a640: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
a650: 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20 74  or, but do log t
a660: 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  he.** error..**.
a670: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
a680: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 72  is not safe to r
a690: 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66 74  etry close() aft
a6a0: 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20 74  er EINTR since t
a6b0: 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  he.** file descr
a6c0: 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76 65  iptor might have
a6d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
a6e0: 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20  used by another 
a6f0: 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65  thread..** So we
a700: 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79 20   don't even try 
a710: 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
a720: 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74 20  an EINTR.  Just 
a730: 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  log the error.**
a740: 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f   and move on..*/
a750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 62  .static void rob
a760: 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69  ust_close(unixFi
a770: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68  le *pFile, int h
a780: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
a790: 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29 20   if( osClose(h) 
a7a0: 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  ){.    unixLogEr
a7b0: 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54 45  rorAtLine(SQLITE
a7c0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63  _IOERR_CLOSE, "c
a7d0: 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20  lose",.         
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
a7f0: 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61  ile ? pFile->zPa
a800: 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b  th : 0, lineno);
a810: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
a820: 74 20 74 68 65 20 70 46 69 6c 65 2d 3e 6c 61 73  t the pFile->las
a830: 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74 68 69 73  tErrno.  Do this
a840: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
a850: 20 61 73 20 74 68 61 74 20 70 72 6f 76 69 64 65   as that provide
a860: 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s.** a convenien
a870: 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
a880: 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
a890: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
a8a0: 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46  eLastErrno(unixF
a8b0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
a8c0: 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d  error){.  pFile-
a8d0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
a8e0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  or;.}../*.** Clo
a8f0: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
a900: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
a910: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
a920: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
a930: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
a940: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
a950: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
a960: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
a970: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a980: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
a990: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
a9a0: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
a9b0: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
a9c0: 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  r(p=pInode->pUnu
a9d0: 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  sed; p; p=pNext)
a9e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
a9f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75  >pNext;.    robu
aa00: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
aa10: 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  p->fd, __LINE__)
aa20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
aa30: 65 65 28 70 29 3b 0a 20 20 20 20 6e 55 6e 75 73  ee(p);.    nUnus
aa40: 65 64 46 64 2d 2d 3b 0a 20 20 7d 0a 20 20 70 49  edFd--;.  }.  pI
aa50: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
aa60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
aa70: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
aa80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
aa90: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
aaa0: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
aab0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
aac0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
aad0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
aae0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
aaf0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
ab00: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
ab10: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
ab20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ab30: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
ab40: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
ab50: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
ab60: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
ab70: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
ab80: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
ab90: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
aba0: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
abb0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
abc0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
abd0: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
abe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
abf0: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
ac00: 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 );.#ifdef SQLI
ac10: 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e  TE_SHARED_MAPPIN
ac20: 47 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  G.      if( pIno
ac30: 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69  de->pSharedMappi
ac40: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  ng ){.        os
ac50: 4d 75 6e 6d 61 70 28 70 49 6e 6f 64 65 2d 3e 70  Munmap(pInode->p
ac60: 53 68 61 72 65 64 4d 61 70 70 69 6e 67 2c 20 70  SharedMapping, p
ac70: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61  Inode->nSharedMa
ac80: 70 70 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  pping);.        
ac90: 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d  pInode->pSharedM
aca0: 61 70 70 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  apping = 0;.    
acb0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
acc0: 72 65 64 4d 61 70 70 69 6e 67 20 3d 20 30 3b 0a  redMapping = 0;.
acd0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
ace0: 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
acf0: 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
ad00: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
ad10: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
ad20: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ad30: 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49  pPrev->pNext==pI
ad40: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
ad50: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
ad60: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
ad70: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
ad80: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
ad90: 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49  t( inodeList==pI
ada0: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
adb0: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
adc0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  de->pNext;.     
add0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
ade0: 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ode->pNext ){.  
adf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ae00: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
ae10: 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  ev==pInode );.  
ae20: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e        pInode->pN
ae30: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ext->pPrev = pIn
ae40: 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ode->pPrev;.    
ae50: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ae60: 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a  3_free(pInode);.
ae70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
ae80: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30  rt( inodeList!=0
ae90: 20 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30   || nUnusedFd==0
aea0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   );.}../*.** Giv
aeb0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
aec0: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65  ptor, locate the
aed0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
aee0: 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65  bject that.** de
aef0: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
af00: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
af10: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
af20: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
af30: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
af40: 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  ue might be unin
af50: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
af60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
af70: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
af80: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
af90: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
afa0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
afb0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
afc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
afd0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
afe0: 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  turn an appropri
aff0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
b000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
b010: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75  ndInodeInfo(.  u
b020: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b040: 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20   Unix file with 
b050: 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69  file desc used i
b060: 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75  n the key */.  u
b070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70  nixInodeInfo **p
b080: 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a  pInode        /*
b090: 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78   Return the unix
b0a0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
b0b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
b0c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0e0: 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75  System call retu
b0f0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
b100: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
b110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b120: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
b130: 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a  or for pFile */.
b140: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
b150: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
b160: 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66   /* Lookup key f
b170: 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  or the unixInode
b180: 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74  Info */.  struct
b190: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20   stat statbuf;  
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
b1b0: 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
b1c0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78  mation */.  unix
b1d0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
b1e0: 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61  e = 0;     /* Ca
b1f0: 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64  ndidate unixInod
b200: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  eInfo object */.
b210: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
b220: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20  utexHeld() );.. 
b230: 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65   /* Get low-leve
b240: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
b250: 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61  out the file tha
b260: 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f  t we can used to
b270: 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75  .  ** create a u
b280: 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74  nique name for t
b290: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
b2a0: 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
b2b0: 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64   rc = osFstat(fd
b2c0: 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69  , &statbuf);.  i
b2d0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
b2e0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
b2f0: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69  File, errno);.#i
b300: 66 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46  f defined(EOVERF
b310: 4c 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28  LOW) && defined(
b320: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
b330: 46 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c  FS).    if( pFil
b340: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
b350: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
b360: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
b370: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
b380: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
b390: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
b3a0: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
b3b0: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
b3c0: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
b3d0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
b3e0: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
b3f0: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
b400: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
b410: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
b420: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
b430: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
b440: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
b450: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
b460: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
b470: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
b480: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
b490: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
b4a0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
b4b0: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
b4c0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
b4d0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
b4e0: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
b4f0: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
b500: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
b510: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
b520: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
b530: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
b540: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
b550: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
b560: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
b570: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
b580: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
b590: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
b5a0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
b5b0: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
b5c0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
b5d0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
b5e0: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
b5f0: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
b600: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
b610: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
b620: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
b630: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
b640: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
b650: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
b660: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
b670: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
b680: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
b690: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
b6a0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
b6b0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
b6c0: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
b6d0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
b6e0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
b6f0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
b700: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
b710: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=0 ){.      sto
b720: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
b730: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
b740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
b750: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
b760: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
b770: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
b780: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
b790: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
b7a0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
b7b0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
b7c0: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
b7d0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
b7e0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34  ileId.ino = (u64
b7f0: 29 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b  )statbuf.st_ino;
b800: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
b810: 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c  ( inodeList!=0 |
b820: 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29  | nUnusedFd==0 )
b830: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  ;.  pInode = ino
b840: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
b850: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
b860: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
b870: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
b880: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
b890: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
b8a0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
b8b0: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
b8c0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
b8d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
b8e0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
b8f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
b900: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
b910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
b920: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
b930: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
b940: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
b950: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
b960: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
b970: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
b980: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
b990: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20   pInode->nRef = 
b9a0: 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  1;.    pInode->p
b9b0: 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74  Next = inodeList
b9c0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50  ;.    pInode->pP
b9d0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
b9e0: 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f   inodeList ) ino
b9f0: 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  deList->pPrev = 
ba00: 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64  pInode;.    inod
ba10: 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a  eList = pInode;.
ba20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
ba30: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ode->nRef++;.  }
ba40: 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49  .  *ppInode = pI
ba50: 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  node;.  return S
ba60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ba70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
ba80: 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e  f pFile has been
ba90: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
baa0: 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77 61  nked since it wa
bab0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a  s first opened..
bac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
bad0: 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46  leHasMoved(unixF
bae0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66  ile *pFile){.#if
baf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
bb00: 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  turn pFile->pIno
bb10: 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e  de!=0 && pFile->
bb20: 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  pId!=pFile->pIno
bb30: 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a  de->fileId.pId;.
bb40: 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73  #else.  struct s
bb50: 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72  tat buf;.  retur
bb60: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
bb70: 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53  =0 &&.      (osS
bb80: 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  tat(pFile->zPath
bb90: 2c 20 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20  , &buf)!=0 .    
bba0: 20 20 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66       || (u64)buf
bbb0: 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e  .st_ino!=pFile->
bbc0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
bbd0: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  no);.#endif.}...
bbe0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e  /*.** Check a un
bbf0: 69 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61  ixFile that is a
bc00: 20 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69   database.  Veri
bc10: 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  fy the following
bc20: 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72  :.**.** (1) Ther
bc30: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
bc40: 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68   hard link on th
bc50: 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68  e file.** (2) Th
bc60: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  e file is not a 
bc70: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a  symbolic link.**
bc80: 20 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61   (3) The file ha
bc90: 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d  s not been renam
bca0: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a  ed or unlinked.*
bcb0: 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74  *.** Issue sqlit
bcc0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
bcd0: 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61  RNING,...) messa
bce0: 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ges if anything 
bcf0: 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f  is not right..*/
bd00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72  .static void ver
bd10: 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69  ifyDbFile(unixFi
bd20: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74  le *pFile){.  st
bd30: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
bd40: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
bd50: 68 65 73 65 20 76 65 72 69 66 69 63 61 74 69 6f  hese verificatio
bd60: 6e 73 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68  ns occurs for th
bd70: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
bd80: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46  only */.  if( pF
bd90: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
bda0: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
bdb0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63   ) return;..  rc
bdc0: 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65   = osFstat(pFile
bdd0: 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66  ->h, &buf);.  if
bde0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
bdf0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
be00: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e  E_WARNING, "cann
be10: 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65  ot fstat db file
be20: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
be30: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
be40: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
be50: 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20  t_nlink==0 ){.  
be60: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
be70: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
be80: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
be90: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
bea0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
beb0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
bec0: 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e  f( buf.st_nlink>
bed0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
bee0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
bef0: 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c  ING, "multiple l
bf00: 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73  inks to file: %s
bf10: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
bf20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
bf30: 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d  }.  if( fileHasM
bf40: 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20  oved(pFile) ){. 
bf50: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
bf60: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
bf70: 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69  file renamed whi
bf80: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
bf90: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
bfa0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
bfb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
bfc0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
bfd0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
bfe0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
bff0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
c000: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
c010: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
c020: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
c030: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
c040: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
c050: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
c060: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
c070: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
c080: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
c090: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
c0a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
c0b0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
c0c0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
c0d0: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
c0e0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68  tatic int unixCh
c0f0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
c100: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
c110: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
c120: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c130: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
c140: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
c150: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
c160: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
c170: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
c180: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
c190: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
c1a0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
c1b0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
c1c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
c1d0: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
c1e0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69  ED_LOCK );.  uni
c1f0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
c200: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
c210: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
c220: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
c230: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
c240: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
c250: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
c260: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
c270: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
c280: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
c290: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
c2a0: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
c2b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
c2c0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
c2d0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
c2e0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
c2f0: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
c300: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
c310: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
c320: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
c330: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
c340: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
c350: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
c360: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
c370: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
c380: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
c390: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
c3a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c3b0: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
c3c0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
c3d0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
c3e0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
c3f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
c400: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
c410: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
c420: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
c430: 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  no);.    } else 
c440: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
c450: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
c460: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
c470: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
c480: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
c490: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
c4a0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
c4b0: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
c4c0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
c4d0: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
c4e0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
c4f0: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
c500: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
c510: 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79  empt to set a sy
c520: 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  stem-lock on the
c530: 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68   file pFile.  Th
c540: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65  e lock is .** de
c550: 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b  scribed by pLock
c560: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
c570: 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  File was opened 
c580: 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20  read/write from 
c590: 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20  unix-excl, then 
c5a0: 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a  the only lock.**
c5b0: 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69   ever obtained i
c5c0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
c5d0: 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f  ock, and it is o
c5e0: 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20  btained exactly 
c5f0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73  once.** the firs
c600: 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20  t time any lock 
c610: 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41  is attempted.  A
c620: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  ll subsequent sy
c630: 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  stem locking.** 
c640: 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d  operations becom
c650: 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69  e no-ops.  Locki
c660: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74  ng operations st
c670: 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72  ill happen inter
c680: 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64  nally,.** in ord
c690: 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  er to coordinate
c6a0: 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20   access between 
c6b0: 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73  separate databas
c6c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
c6d0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f   within this pro
c6e0: 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66  cess, but all of
c6f0: 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64   that is handled
c700: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74   in memory and t
c710: 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  he.** operating 
c720: 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
c730: 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a  participate..**.
c740: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c750: 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75   is a pass-throu
c760: 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  gh to fcntl(F_SE
c770: 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73  TLK) if pFile is
c780: 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46   using.** any VF
c790: 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e  S other than "un
c7a0: 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70  ix-excl" or if p
c7b0: 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  File is opened o
c7c0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a  n "unix-excl".**
c7d0: 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
c7e0: 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  y..**.** Zero is
c7f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
c800: 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20   call completes 
c810: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72  successfully, or
c820: 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a   -1 if a call.**
c830: 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c   to fcntl() fail
c840: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
c850: 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70   errno is set ap
c860: 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20  propriately (by 
c870: 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61  fcntl())..*/.sta
c880: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
c890: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
c8a0: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
c8b0: 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e  ck *pLock){.  in
c8c0: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
c8d0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
c8e0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
c8f0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
c900: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
c910: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
c920: 29 3b 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  );.  if( (pFile-
c930: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 28 55 4e  >ctrlFlags & (UN
c940: 49 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58  IXFILE_EXCL|UNIX
c950: 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55  FILE_RDONLY))==U
c960: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a  NIXFILE_EXCL ){.
c970: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
c980: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
c990: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
c9a0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
c9b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c9c0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ->nLock==0 );.  
c9d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c9e0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c9f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
ca00: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
ca10: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
ca20: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
ca30: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
ca40: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
ca50: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
ca60: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
ca70: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
ca80: 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74    if( rc<0 ) ret
ca90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49  urn rc;.      pI
caa0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
cab0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ck = 1;.      pI
cac0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
cad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cae0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
caf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
cb00: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
cb10: 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b  , F_SETLK, pLock
cb20: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cb30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
cb40: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
cb50: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
cb60: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
cb70: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
cb80: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
cb90: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
cba0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
cbb0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
cbc0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
cbd0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
cbe0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
cbf0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
cc00: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
cc10: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
cc20: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
cc30: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
cc40: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
cc50: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
cc60: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
cc70: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
cc80: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
cc90: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
cca0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
ccb0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
ccc0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
ccd0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
cce0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
ccf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
cd00: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
cd10: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
cd20: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
cd30: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
cd40: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
cd50: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
cd60: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
cd70: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
cd80: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
cd90: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
cda0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
cdb0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
cdc0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
cdd0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
cde0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
cdf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
ce00: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
ce10: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
ce20: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
ce30: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
ce40: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
ce50: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
ce60: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
ce70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
ce80: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
ce90: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
cea0: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
ceb0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
cec0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
ced0: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
cee0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
cef0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
cf00: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
cf10: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
cf20: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
cf30: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
cf40: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
cf50: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
cf60: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
cf70: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
cf80: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
cf90: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
cfa0: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
cfb0: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
cfc0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
cfd0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
cfe0: 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d  Windows95 system
cff0: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
d000: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
d010: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d020: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
d030: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
d040: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
d050: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
d060: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
d070: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
d080: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
d090: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
d0a0: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
d0b0: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
d0c0: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
d0d0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
d0e0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
d0f0: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
d100: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
d110: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
d120: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
d130: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
d140: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
d150: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
d160: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
d170: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
d180: 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72  uccessful, 'shar
d190: 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69  ed byte range' i
d1a0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20  s read-locked.  
d1b0: 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ** and the lock 
d1c0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
d1d0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20  byte' released. 
d1e0: 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20   (Legacy note:  
d1f0: 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65  When.  ** SQLite
d200: 20 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c   was first devel
d210: 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20  oped, Windows95 
d220: 73 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69  systems were sti
d230: 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a  ll very common,.
d240: 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73    ** and Widnows
d250: 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65  95 lacks a share
d260: 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74  d-lock capabilit
d270: 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77  y.  So on Window
d280: 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67  s95, a.  ** sing
d290: 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65  le randomly sele
d2a0: 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65  cted by from the
d2b0: 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61   'shared byte ra
d2c0: 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  nge' is locked..
d2d0: 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69    ** Windows95 i
d2e0: 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63  s now pretty muc
d2f0: 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74  h extinct, but t
d300: 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
d310: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63  for the.  ** lac
d320: 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b  k of shared-lock
d330: 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c  s on Windows95 l
d340: 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63  ives on, for bac
d350: 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70  kwards.  ** comp
d360: 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a  atibility.).  **
d370: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
d380: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
d390: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
d3a0: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
d3b0: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
d3c0: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
d3d0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
d3e0: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
d3f0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
d400: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
d410: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
d420: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
d430: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
d440: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
d450: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
d460: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
d470: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
d480: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
d490: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
d4a0: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
d4b0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
d4c0: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
d4d0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
d4e0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
d4f0: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
d500: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
d510: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
d520: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
d530: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
d540: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
d550: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
d560: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
d570: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
d580: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
d590: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
d5a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
d5b0: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
d5c0: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
d5d0: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
d5e0: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
d5f0: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
d600: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
d610: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
d620: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
d630: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
d640: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
d650: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
d660: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
d670: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
d680: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
d690: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
d6a0: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
d6b0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
d6c0: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
d6d0: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
d6e0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
d6f0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
d700: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
d710: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f   database. .  */
d720: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d730: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
d740: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
d750: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
d760: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
d770: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
d780: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45  k lock;.  int tE
d790: 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rrno = 0;..  ass
d7a0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
d7b0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
d7c0: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
d7d0: 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  s,%d) pid=%d (un
d7e0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
d7f0: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
d800: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
d810: 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
d820: 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
d830: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46     azFileLock(pF
d840: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
d850: 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e  leLock), pFile->
d860: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
d870: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
d880: 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0)));..  /* If t
d890: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d8a0: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
d8b0: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
d8c0: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
d8d0: 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f   ** unixFile, do
d8e0: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
d8f0: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
d900: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
d910: 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75    ** unixEnterMu
d920: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
d930: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
d940: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d950: 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65  eFileLock>=eFile
d960: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52  Lock ){.    OSTR
d970: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
d980: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
d990: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
d9a0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
d9b0: 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
d9c0: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
d9d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d9e0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
d9f0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
da00: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
da10: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
da20: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
da30: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
da40: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
da50: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
da60: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
da70: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
da80: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
da90: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
daa0: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
dab0: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
dac0: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
dad0: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
dae0: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
daf0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
db00: 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
db10: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
db20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
db30: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
db40: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
db50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
db60: 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
db70: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
db80: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
db90: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
dba0: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
dbb0: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
dbc0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
dbd0: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
dbe0: 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
dbf0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
dc00: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
dc10: 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
dc20: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
dc30: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
dc40: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
dc50: 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
dc60: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
dc70: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
dc80: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
dc90: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
dca0: 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
dcb0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
dcc0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f  .          (pIno
dce0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  de->eFileLock>=P
dcf0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65  ENDING_LOCK || e
dd00: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
dd10: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
dd20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
dd30: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
dd40: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ock;.  }..  /* I
dd50: 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  f a SHARED lock 
dd60: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  is requested, an
dd70: 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  d some thread us
dd80: 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72  ing this PID alr
dd90: 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20  eady.  ** has a 
dda0: 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56  SHARED or RESERV
ddb0: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e  ED lock, then in
ddc0: 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  crement referenc
ddd0: 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a  e counts and.  *
dde0: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
ddf0: 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OK..  */.  if( e
de00: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
de10: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
de20: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
de30: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
de40: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
de50: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
de60: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
de70: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
de80: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
de90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
dea0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
deb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
dec0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
ded0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
dee0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
def0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
df00: 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
df10: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
df20: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c  ;.    goto end_l
df30: 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ock;.  }...  /* 
df40: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
df50: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
df60: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
df70: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
df80: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
df90: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
dfa0: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
dfb0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
dfc0: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
dfd0: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
dfe0: 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  */.  lock.l_len 
dff0: 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  = 1L;.  lock.l_w
e000: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
e010: 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  ;.  if( eFileLoc
e020: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  k==SHARED_LOCK .
e030: 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c        || (eFileL
e040: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
e050: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  OCK && pFile->eF
e060: 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f  ileLock<PENDING_
e070: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c  LOCK).  ){.    l
e080: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46  ock.l_type = (eF
e090: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
e0a0: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
e0b0: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
e0c0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
e0d0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20  G_BYTE;.    if( 
e0e0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e0f0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
e100: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
e110: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
e120: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e130: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e140: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e150: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
e160: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
e170: 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
e180: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
e190: 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
e1a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
e1b0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
e1c0: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
e1d0: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
e1e0: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
e1f0: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
e200: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
e210: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
e220: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
e230: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
e240: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e250: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
e260: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
e270: 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
e280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
e290: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
e2a0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
e2b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e2c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
e2d0: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
e2e0: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
e2f0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
e300: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
e310: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
e320: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
e330: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e340: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
e350: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e360: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
e370: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
e380: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
e390: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
e3a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
e3b0: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
e3c0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
e3d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e3e0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
e3f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
e400: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
e410: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
e420: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
e430: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e440: 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ck) && rc==SQLIT
e450: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
e460: 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
e470: 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
e480: 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
e490: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e4a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e4b0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
e4c0: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28   .    }..    if(
e4d0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
e4e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
e4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
e500: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
e510: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
e520: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
e530: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
e540: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
e550: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
e560: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
e570: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
e580: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
e590: 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
e5a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
e5b0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
e5c0: 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
e5d0: 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
e5e0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
e5f0: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
e600: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
e610: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
e620: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
e630: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
e640: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
e650: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
e660: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
e670: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
e680: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
e690: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
e6a0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
e6b0: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
e6c0: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
e6d0: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
e6e0: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
e6f0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
e700: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
e710: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e720: 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
e730: 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
e740: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
e750: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
e760: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
e770: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
e780: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e790: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
e7a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
e7b0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
e7c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e7d0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
e7e0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e7f0: 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
e800: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
e810: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
e820: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
e830: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
e840: 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
e850: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e860: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
e870: 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
e880: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
e890: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e8a0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e8b0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e8c0: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
e8d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
e8e0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
e8f0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
e900: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
e910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e920: 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ..#ifdef SQLITE
e930: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20  _DEBUG.  /* Set 
e940: 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
e950: 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67  on-counter chang
e960: 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73  e checking flags
e970: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   when.  ** trans
e980: 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20  itioning from a 
e990: 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45  SHARED to a RESE
e9a0: 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20  RVED lock.  The 
e9b0: 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d  change.  ** from
e9c0: 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
e9d0: 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65  VED marks the be
e9e0: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72  ginning of a nor
e9f0: 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f  mal.  ** write o
ea00: 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20  peration (not a 
ea10: 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot journal roll
ea20: 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  back)..  */.  if
ea30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
ea40: 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69     && pFile->eFi
ea50: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
ea60: 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c  OCK.   && eFileL
ea70: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
ea80: 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c  CK.  ){.    pFil
ea90: 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
eaa0: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
eab0: 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
eac0: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
ead0: 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d  alWrite = 1;.  }
eae0: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20  .#endif...  if( 
eaf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eb00: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
eb10: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
eb20: 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
eb30: 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
eb40: 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
eb50: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
eb60: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
eb70: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
eb80: 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
eb90: 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
eba0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
ebb0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
ebc0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
ebd0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
ebe0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
ebf0: 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29   %d %s %s (unix)
ec00: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
ec10: 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
ec20: 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ock), .      rc=
ec30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
ec40: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
ec50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ec60: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69  /*.** Add the fi
ec70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
ec80: 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c  ed by file handl
ec90: 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63  e pFile to the c
eca0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
ecb0: 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f  pUnused list..*/
ecc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
ecd0: 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69  PendingFd(unixFi
ece0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
ecf0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
ed00: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ed10: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
ed20: 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e  dFd *p = pFile->
ed30: 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
ed40: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
ed50: 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  = pInode->pUnuse
ed60: 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  d;.  pInode->pUn
ed70: 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c  used = p;.  pFil
ed80: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69  e->h = -1;.  pFi
ed90: 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
eda0: 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a 20 20 6e  dUnused = 0;.  n
edb0: 55 6e 75 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a 2f  UnusedFd++;.}../
edc0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
edd0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
ede0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
edf0: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
ee00: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
ee10: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
ee20: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
ee30: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
ee40: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
ee50: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
ee60: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
ee70: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
ee80: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
ee90: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
eea0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
eeb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
eec0: 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
eed0: 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
eee0: 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
eef0: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
ef00: 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
ef10: 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
ef20: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
ef30: 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
ef40: 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
ef50: 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
ef60: 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
ef70: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
ef80: 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
ef90: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
efa0: 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
efb0: 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
efc0: 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
efd0: 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
efe0: 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
eff0: 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
f000: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
f010: 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
f020: 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
f030: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f040: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
f050: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f060: 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
f070: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
f080: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
f090: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f0a0: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
f0b0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
f0c0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
f0d0: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
f0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
f0f0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
f100: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
f110: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
f120: 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
f130: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
f140: 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
f150: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
f160: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
f170: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
f180: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
f190: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47  hared,.      osG
f1a0: 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
f1b0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
f1c0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
f1d0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
f1e0: 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
f1f0: 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
f200: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f210: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
f220: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
f230: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
f240: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
f250: 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
f260: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
f270: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
f280: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f290: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
f2a0: 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
f2b0: 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  ock );..#ifdef S
f2c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
f2d0: 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
f2e0: 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
f2f0: 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
f300: 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
f310: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
f320: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
f330: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
f340: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
f350: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
f360: 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
f370: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
f380: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
f390: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
f3a0: 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
f3b0: 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
f3c0: 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
f3d0: 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
f3e0: 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
f3f0: 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
f400: 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
f410: 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
f420: 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
f430: 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
f440: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
f450: 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
f460: 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
f470: 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
f480: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
f490: 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
f4a0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
f4b0: 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
f4c0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77  ndif..    /* dow
f4d0: 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68  ngrading to a sh
f4e0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53  ared lock on NFS
f4f0: 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69   involves cleari
f500: 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ng the write loc
f510: 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  k.    ** before 
f520: 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65  establishing the
f530: 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61   readlock - to a
f540: 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64  void a race cond
f550: 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61  ition we downgra
f560: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  de.    ** the lo
f570: 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20  ck in 2 blocks, 
f580: 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20  so that part of 
f590: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62  the range will b
f5a0: 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a  e covered by a .
f5b0: 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63      ** write loc
f5c0: 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74  k until the rest
f5d0: 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61   is covered by a
f5e0: 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20   read lock:.    
f5f0: 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d  **  1:   [WWWWW]
f600: 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e  .    **  2:   [.
f610: 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a  ...W].    **  3:
f620: 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a     [RRRRW].    *
f630: 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a  *  4:   [RRRR.].
f640: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
f650: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
f660: 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65  _LOCK ){.#if !de
f670: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
f680: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42   || !SQLITE_ENAB
f690: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
f6a0: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e  .      (void)han
f6b0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20  dleNFSUnlock;.  
f6c0: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64      assert( hand
f6d0: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29  leNFSUnlock==0 )
f6e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
f6f0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f700: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f710: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
f720: 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e       if( handleN
f730: 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  FSUnlock ){.    
f740: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20      int tErrno; 
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f760: 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
f770: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72   system call err
f780: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ors */.        o
f790: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
f7a0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
f7b0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
f7c0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f7d0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
f7e0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f7f0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
f800: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f810: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
f820: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
f830: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
f840: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f850: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f860: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
f870: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
f880: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
f890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f8a0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f8b0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
f8c0: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
f8d0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
f8e0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
f8f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f900: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f910: 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _RDLCK;.        
f920: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f930: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
f940: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
f950: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
f960: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
f970: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
f980: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f990: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f9a0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
f9b0: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
f9c0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
f9d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
f9e0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
f9f0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
fa00: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20  OERR_RDLOCK);.  
fa10: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
fa20: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
fa30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
fa40: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
fa50: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
fa60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fa70: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
fa80: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
fa90: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
faa0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
fab0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
fac0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
fad0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
fae0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
faf0: 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
fb00: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
fb10: 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
fb20: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
fb30: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
fb40: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
fb50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
fb60: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
fb70: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
fb80: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fb90: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  K;.          sto
fba0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
fbb0: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
fbc0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
fbd0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
fbe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
fbf0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
fc00: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
fc10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
fc20: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
fc30: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
fc40: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
fc50: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
fc60: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
fc70: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
fc80: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
fc90: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
fca0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
fcb0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
fcc0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
fcd0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
fce0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
fcf0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
fd00: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
fd10: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
fd20: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
fd30: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
fd40: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
fd50: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
fd60: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
fd70: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
fd80: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
fd90: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
fda0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
fdb0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
fdc0: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
fdd0: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
fde0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
fdf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
fe00: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
fe10: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
fe20: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
fe30: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
fe40: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
fe50: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
fe60: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
fe70: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
fe80: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
fe90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fea0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
feb0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
fec0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
fed0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
fee0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
fef0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
ff10: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ff20: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
ff30: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ff40: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
ff50: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
ff60: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
ff70: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
ff80: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
ff90: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
ffa0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
ffb0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
ffc0: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
ffd0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
ffe0: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
fff0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10000 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
10010 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
10020 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10030 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
10040 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
10050 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  unlock;.    }.  
10060 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  }.  if( eFileLoc
10070 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k==NO_LOCK ){.  
10080 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
10090 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
100a0 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
100b0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
100c0 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
100d0 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
100e0 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
100f0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
10100 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
10110 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
10120 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
10130 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
10140 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
10150 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  d==0 ){.      lo
10160 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
10170 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
10180 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10190 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
101a0 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
101b0 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
101c0 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
101d0 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
101e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
101f0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
10200 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
10210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10220 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10230 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
10240 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10250 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
10260 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
10270 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
10280 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
10290 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
102a0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
102b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
102c0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
102d0 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
102e0 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
102f0 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
10300 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
10310 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
10320 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
10330 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
10340 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
10350 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
10360 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
10370 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
10380 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
10390 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
103a0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
103b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
103c0 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
103d0 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
103e0 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
103f0 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
10400 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
10410 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
10420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
10430 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10440 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
10450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10460 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
10470 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
10480 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
10490 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
104a0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
104b0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
104c0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
104d0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
104e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
104f0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
10500 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
10510 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
10520 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
10530 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
10540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10550 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10560 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
10570 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10580 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
10590 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  k){.#if SQLITE_M
105a0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
105b0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
105c0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
105d0 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29  || ((unixFile *)
105e0 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  id)->nFetchOut==
105f0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  0 );.#endif.  re
10600 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
10610 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
10620 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  0);.}..#if SQLIT
10630 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10640 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  0.static int uni
10650 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
10660 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
10670 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
10680 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
10690 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65  ixFile *pFd);.#e
106a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
106b0 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
106c0 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
106d0 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
106e0 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
106f0 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
10700 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
10710 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
10720 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
10730 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
10740 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
10750 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
10760 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
10770 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
10780 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
10790 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
107a0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
107b0 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
107c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
107d0 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
107e0 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
107f0 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
10800 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
10810 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
10820 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
10830 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10840 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
10850 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10860 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
10870 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10880 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  )id;.#if SQLITE_
10890 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
108a0 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
108b0 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
108c0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
108d0 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
108e0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
108f0 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
10900 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
10910 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
10920 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
10930 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
10940 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
10950 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
10960 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
10970 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
10980 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
10990 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
109a0 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
109b0 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
109c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
109d0 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
109e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
109f0 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
10a00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
10a10 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
10a20 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
10a30 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
10a40 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
10a50 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72  ite3_free(*(char
10a60 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68  **)&pFile->zPath
10a70 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50  );.    pFile->zP
10a80 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ath = 0;.  }.#en
10a90 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
10aa0 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
10ab0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
10ac0 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
10ad0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10ae0 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
10af0 74 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65  tedUnused);.  me
10b00 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
10b10 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
10b20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10b30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10b40 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
10b50 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
10b60 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
10b70 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
10b80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10b90 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10ba0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
10bb0 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65  ;.  verifyDbFile
10bc0 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55  (pFile);.  unixU
10bd0 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
10be0 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  K);.  unixEnterM
10bf0 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e  utex();..  /* un
10c00 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73  ixFile.pInode is
10c10 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65   always valid he
10c20 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  re. Otherwise, a
10c30 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65   different close
10c40 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65  .  ** routine (e
10c50 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  .g. nolockClose(
10c60 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c  )) would be call
10c70 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f  ed instead..  */
10c80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
10c90 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ->pInode->nLock>
10ca0 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  0 || pFile->pIno
10cb0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
10cc0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ==0 );.  if( ALW
10cd0 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  AYS(pFile->pInod
10ce0 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  e) && pFile->pIn
10cf0 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
10d00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
10d10 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
10d20 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
10d30 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
10d40 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
10d50 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
10d60 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
10d70 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
10d80 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
10d90 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
10da0 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55  or to pInode->pU
10db0 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20  nused list.  It 
10dc0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
10dd0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20  cally closed .  
10de0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61    ** when the la
10df0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
10e00 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
10e10 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
10e20 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
10e30 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
10e40 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
10e50 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
10e60 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
10e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10e80 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10e90 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   End of the posi
10ea0 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20  x advisory lock 
10eb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
10ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ed0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
10f20 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f70 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f90 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a   No-op Locking *
10fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fc0 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76  *.**.** Of the v
10fd0 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69  arious locking i
10fe0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
10ff0 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69  vailable, this i
11000 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20  s by far the.** 
11010 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69  simplest:  locki
11020 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  ng is ignored.  
11030 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  No attempt is ma
11040 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64  de to lock the d
11050 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
11060 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
11070 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
11080 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
11090 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
110a0 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f  or use on read-o
110b0 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  nly databases.**
110c0 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20   (ex: databases 
110d0 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20  that are burned 
110e0 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72  into CD-ROM, for
110f0 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63   example.)  It c
11100 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73  an.** also be us
11110 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63  ed if the applic
11120 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f  ation employs so
11130 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68  me external mech
11140 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76  anism to.** prev
11150 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ent simultaneous
11160 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73   access of the s
11170 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20  ame database by 
11180 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64  two or more.** d
11190 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
111a0 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  ons.  But there 
111b0 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73  is a serious ris
111c0 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  k of database.**
111d0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74   corruption if t
111e0 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
111f0 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75   is used in situ
11200 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c  ations where mul
11210 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73  tiple.** databas
11220 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
11230 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
11240 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
11250 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a  le at the same.*
11260 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f  * time and one o
11270 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20  r more of those 
11280 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
11290 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61  writing..*/..sta
112a0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68  tic int nolockCh
112b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
112c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
112d0 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73  tUsed, int *pRes
112e0 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
112f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
11300 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11310 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
11320 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
11330 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73  int nolockLock(s
11340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
11350 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
11360 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
11370 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
11380 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
11390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
113a0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
113b0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
113c0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
113d0 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
113e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
113f0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
11400 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
11410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11420 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
11430 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
11440 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  int nolockClose(
11450 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11460 29 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ) {.#ifdef SQLIT
11470 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47  E_SHARED_MAPPING
11480 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
11490 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
114a0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 49 6e  ;.  if( pFd->pIn
114b0 6f 64 65 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  ode ){.    unixE
114c0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
114d0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
114e0 6f 28 70 46 64 29 3b 0a 20 20 20 20 75 6e 69 78  o(pFd);.    unix
114f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
11500 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
11510 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
11520 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  id);.}../*******
11530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
11540 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f   of the no-op lo
11550 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
11560 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
11570 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115c0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
115d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c  ** Begin dot-fil
11640 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
11670 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  he dotfile locki
11680 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
11690 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74  n uses the exist
116a0 65 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65  ence of separate
116b0 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28   lock.** files (
116c0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
116d0 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  ry) to control a
116e0 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74  ccess to the dat
116f0 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72  abase.  This wor
11700 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62  ks.** on just ab
11710 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79  out every filesy
11720 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e  stem imaginable.
11730 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
11740 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65  serious downside
11750 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
11760 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63   There is zero c
11770 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73  oncurrency.  A s
11780 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f  ingle reader blo
11790 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a  cks all other.**
117a0 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
117b0 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e  ions from readin
117c0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
117d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
117e0 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c      (2)  An appl
117f0 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72  ication crash or
11800 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20   power loss can 
11810 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b  leave stale lock
11820 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20   files.**       
11830 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64    sitting around
11840 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
11850 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c   cleared manuall
11860 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68  y..**.** Neverth
11870 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b  eless, a dotlock
11880 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61   is an appropria
11890 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  te locking mode 
118a0 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a  for use if no.**
118b0 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73   other locking s
118c0 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c  trategy is avail
118d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66  able..**.** Dotf
118e0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  ile locking work
118f0 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
11900 73 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20  subdirectory in 
11910 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
11920 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74  ry as.** the dat
11930 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74  abase and with t
11940 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74  he same name but
11950 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20   with a ".lock" 
11960 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e  extension added.
11970 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63  .** The existenc
11980 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65  e of a lock dire
11990 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e  ctory implies an
119a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
119b0 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c    All other.** l
119c0 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45  ock types (SHARE
119d0 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e  D, RESERVED, PEN
119e0 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64  DING) are mapped
119f0 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e   into EXCLUSIVE.
11a00 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .*/../*.** The f
11a10 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64  ile suffix added
11a20 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73   to the data bas
11a30 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72  e filename in or
11a40 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  der to create th
11a50 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74  e.** lock direct
11a60 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ory..*/.#define 
11a70 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22  DOTLOCK_SUFFIX "
11a80 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  .lock"../*.** Th
11a90 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
11aa0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
11ab0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
11ac0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
11ad0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
11ae0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
11af0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
11b00 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
11b10 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
11b20 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
11b30 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
11b40 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
11b50 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
11b60 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
11b70 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
11b80 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
11b90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
11ba0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
11bb0 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66  g..**.** In dotf
11bc0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74  ile locking, eit
11bd0 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74  her a lock exist
11be0 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74  s or it does not
11bf0 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a  .  So in this.**
11c00 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68   variation of Ch
11c10 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11c20 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  ), *pResOut is s
11c30 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e  et to true if an
11c40 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c  y lock.** is hel
11c50 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  d on the file an
11c60 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66  d false if the f
11c70 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
11c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11c90 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
11ca0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
11cb0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
11cc0 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
11cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11ce0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11cf0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11d00 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11d10 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
11d20 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11d30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
11d40 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
11d50 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
11d60 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 72 65 73  ( pFile );.  res
11d70 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73  erved = osAccess
11d80 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46  ((const char*)pF
11d90 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
11da0 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53  ext, 0)==0;.  OS
11db0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
11dc0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 64  LOCK %d %d %d (d
11dd0 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  otlock)\n", pFil
11de0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
11df0 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  ed));.  *pResOut
11e00 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
11e10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11e20 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
11e30 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
11e40 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
11e50 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
11e60 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
11e70 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
11e80 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
11e90 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
11ea0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
11eb0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
11ec0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
11ed0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
11ee0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
11ef0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
11f00 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
11f10 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
11f20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
11f30 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
11f40 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
11f50 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
11f60 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
11f70 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
11f80 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
11f90 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
11fa0 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
11fb0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
11fc0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
11fd0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
11fe0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
11ff0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
12000 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
12010 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
12020 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
12030 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
12040 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
12050 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
12060 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
12070 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
12080 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
12090 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
120a0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
120b0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
120c0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
120d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
120e0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
120f0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
12100 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
12110 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
12120 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
12130 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a  ocking level..**
12140 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65  .** With dotfile
12150 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61   locking, we rea
12160 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  lly only support
12170 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c   state (4): EXCL
12180 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65  USIVE..** But we
12190 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72   track the other
121a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
121b0 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73  internally..*/.s
121c0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
121d0 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
121e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
121f0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
12200 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12210 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
12220 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
12230 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
12240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
12250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12260 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
12270 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
12280 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
12290 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
122a0 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
122b0 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
122c0 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
122d0 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
122e0 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
122f0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12300 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
12310 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
12320 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
12330 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41  leLock;.    /* A
12340 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65  lways update the
12350 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68   timestamp on th
12360 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69  e old file */.#i
12370 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a  fdef HAVE_UTIME.
12380 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46      utime(zLockF
12390 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73  ile, NULL);.#els
123a0 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f  e.    utimes(zLo
123b0 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23  ckFile, NULL);.#
123c0 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
123d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
123e0 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
123f0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
12400 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72  /.  rc = osMkdir
12410 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37  (zLockFile, 0777
12420 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b  );.  if( rc<0 ){
12430 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74  .    /* failed t
12440 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
12450 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  e lock directory
12460 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72   */.    int tErr
12470 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12480 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45  if( EEXIST == tE
12490 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
124a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
124b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
124c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
124d0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
124e0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
124f0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
12500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12510 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
12520 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
12530 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
12540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12550 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12560 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
12570 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
12580 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
12590 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
125a0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
125b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
125c0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
125d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
125e0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
125f0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
12600 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
12610 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
12620 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
12630 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
12640 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
12650 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
12660 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
12670 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
12680 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
12690 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
126a0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
126b0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
126c0 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
126d0 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
126e0 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
126f0 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
12700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12710 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
12720 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12730 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12740 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12750 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12760 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
12770 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
12780 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12790 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
127a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
127b0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
127c0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
127d0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
127e0 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
127f0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
12800 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12810 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
12820 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
12830 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
12840 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12850 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
12860 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
12870 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12880 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
12890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
128a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
128b0 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20 74  * To downgrade t
128c0 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c 79  o shared, simply
128d0 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
128e0 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74  rnal notion of t
128f0 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61  he.  ** lock sta
12900 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  te.  No need to 
12910 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66 69  mess with the fi
12920 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
12930 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
12940 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
12950 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12960 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
12970 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
12980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
12990 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20   .  /* To fully 
129a0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
129b0 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
129c0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61  lock file */.  a
129d0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
129e0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72  ==NO_LOCK );.  r
129f0 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63  c = osRmdir(zLoc
12a00 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  kFile);.  if( rc
12a10 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45  <0 ){.    int tE
12a20 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12a30 20 20 69 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e    if( tErrno==EN
12a40 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63  OENT ){.      rc
12a50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
12a70 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12a80 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  _UNLOCK;.      s
12a90 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12aa0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12ab0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
12ac0 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  c; .  }.  pFile-
12ad0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12ae0 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
12af0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12b00 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
12b10 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
12b20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65  lock has been re
12b30 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c  leased before cl
12b40 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  osing..*/.static
12b50 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73   int dotlockClos
12b60 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
12b70 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  id) {.  unixFile
12b80 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12b90 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
12ba0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f  t( id!=0 );.  do
12bb0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
12bc0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69  NO_LOCK);.  sqli
12bd0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
12be0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
12bf0 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
12c00 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f  nixFile(id);.}./
12c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f  ** End of the do
12c30 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c  t-file lock impl
12c40 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
12cb0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
12d20 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a   flock Locking *
12d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12d50 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c  **.** Use the fl
12d60 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ock() system cal
12d70 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63  l to do file loc
12d80 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  king..**.** floc
12d90 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  k() locking is l
12da0 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  ike dot-file loc
12db0 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65  king in that the
12dc0 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65   various.** fine
12dd0 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c  -grain locking l
12de0 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20  evels supported 
12df0 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f  by SQLite are co
12e00 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  llapsed into.** 
12e10 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69  a single exclusi
12e20 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68  ve lock.  In oth
12e30 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44  er words, SHARED
12e40 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a  , RESERVED, and.
12e50 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73  ** PENDING locks
12e60 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68   are the same th
12e70 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53  ing as an EXCLUS
12e80 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74  IVE lock.  SQLit
12e90 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73  e.** still works
12ea0 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69   when you do thi
12eb0 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e  s, but concurren
12ec0 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69  cy is reduced si
12ed0 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  nce.** only a si
12ee0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
12ef0 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
12f00 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69  database at a ti
12f10 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74  me..**.** Omit t
12f20 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53  his section if S
12f30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
12f40 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75  KING_STYLE is tu
12f50 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20  rned off.*/.#if 
12f60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
12f70 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a  CKING_STYLE../*.
12f80 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29  ** Retry flock()
12f90 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
12fa0 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23   with EINTR.*/.#
12fb0 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74  ifdef EINTR.stat
12fc0 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c  ic int robust_fl
12fd0 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ock(int fd, int 
12fe0 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  op){.  int rc;. 
12ff0 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28   do{ rc = flock(
13000 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20  fd,op); }while( 
13010 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
13020 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e  INTR );.  return
13030 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64   rc;.}.#else.# d
13040 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f  efine robust_flo
13050 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c  ck(a,b) flock(a,
13060 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a  b).#endif.     .
13070 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13080 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
13090 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
130a0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
130b0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
130c0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
130d0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
130e0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
130f0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
13100 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
13110 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
13120 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
13130 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
13140 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
13150 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
13160 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
13170 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
13180 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
13190 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
131a0 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
131b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
131c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
131d0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
131e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
131f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
13200 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
13210 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13220 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
13230 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
13240 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
13250 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
13260 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
13270 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
13280 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
13290 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
132a0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
132b0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
132c0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
132d0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
132e0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
132f0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
13300 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
13310 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
13320 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
13330 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
13340 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
13350 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  /* attempt to ge
13360 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  t the lock */.  
13370 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75    int lrc = robu
13380 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13390 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
133a0 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21  K_NB);.    if( !
133b0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
133c0 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e  got the lock, un
133d0 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20  lock it */.     
133e0 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c   lrc = robust_fl
133f0 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13400 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66  CK_UN);.      if
13410 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20   ( lrc ) {.     
13420 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
13430 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f  errno;.        /
13440 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20  * unlock failed 
13450 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f  with an error */
13460 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53  .        lrc = S
13470 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13480 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 73 74 6f  CK; .        sto
13490 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
134a0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
134b0 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
134c0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
134d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
134e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
134f0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
13500 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
13510 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
13520 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
13530 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
13540 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13550 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13560 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
13570 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
13580 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
13590 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
135a0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
135b0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
135c0 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
135d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
135e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
135f0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13600 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13610 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
13620 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53  ved));..#ifdef S
13630 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
13640 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
13650 20 69 66 28 20 28 72 63 20 26 20 30 78 66 66 29   if( (rc & 0xff)
13660 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
13670 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13680 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65  ITE_OK;.    rese
13690 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64  rved=1;.  }.#end
136a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
136b0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
136c0 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73  RRORS */.  *pRes
136d0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
136e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
136f0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
13700 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
13710 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
13720 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
13730 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
13740 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
13750 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
13760 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
13770 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
13780 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
13790 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
137a0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
137b0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
137c0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
137d0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
137e0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
137f0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
13800 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
13810 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
13820 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
13830 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
13840 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
13850 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
13860 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
13870 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
13880 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
13890 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
138a0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
138b0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
138c0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
138d0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
138e0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
138f0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
13900 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
13910 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
13920 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
13930 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
13940 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
13950 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
13960 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
13970 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
13980 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
13990 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
139a0 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  VE.**.** flock()
139b0 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70   only really sup
139c0 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c  port EXCLUSIVE l
139d0 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20  ocks.  We track 
139e0 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20  intermediate.** 
139f0 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74  lock states in t
13a00 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
13a10 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61  structure, but a
13a20 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20  ll locks SHARED 
13a30 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  or.** above are 
13a40 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45  really EXCLUSIVE
13a50 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75   locks and exclu
13a60 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f  de all other pro
13a70 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61  cesses from.** a
13a80 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a  ccess the file..
13a90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13aa0 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
13ab0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
13ac0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
13ad0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
13ae0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
13af0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
13b00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13b10 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  kLock(sqlite3_fi
13b20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
13b30 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
13b40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13b50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13b60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13b70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
13b80 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77  le );..  /* if w
13b90 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
13ba0 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63   lock, it is exc
13bb0 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a  lusive.  .  ** J
13bc0 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c  ust adjust level
13bd0 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74   and punt on out
13be0 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66  ta here. */.  if
13bf0 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
13c00 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  ck > NO_LOCK) {.
13c10 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13c20 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
13c30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13c40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
13c50 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
13c60 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
13c70 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c  .  if (robust_fl
13c80 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13c90 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
13ca0 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  ) {.    int tErr
13cb0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
13cc0 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d  /* didn't get, m
13cd0 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20  ust be busy */. 
13ce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
13cf0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
13d00 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
13d10 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
13d20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
13d30 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
13d40 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
13d50 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
13d60 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
13d70 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  .    /* got it, 
13d80 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
13d90 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
13da0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13db0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
13dc0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
13dd0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
13de0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
13df0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
13e00 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
13e10 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
13e20 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
13e30 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66   "failed"));.#if
13e40 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
13e50 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13e60 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
13e70 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f  0xff) == SQLITE_
13e80 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
13e90 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
13ea0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
13eb0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
13ec0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
13ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13ee0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
13ef0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13f00 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
13f10 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
13f20 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
13f30 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
13f40 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
13f50 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
13f60 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
13f70 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
13f80 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13f90 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
13fa0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
13fb0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
13fc0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
13fd0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13fe0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13ff0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
14000 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14010 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
14020 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14030 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
14040 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
14050 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
14060 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
14070 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63   %d pid=%d (floc
14080 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14090 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
140a0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
140b0 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
140c0 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
140d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
140e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
140f0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
14100 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
14110 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
14120 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
14130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14140 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
14150 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
14160 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
14170 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
14180 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
14190 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
141a0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
141b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
141c0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
141d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
141e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
141f0 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
14200 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lock. */.  if( r
14210 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
14220 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29  e->h, LOCK_UN) )
14230 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
14240 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14250 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74  K_ERRORS.    ret
14260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
14270 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14280 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14290 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
142a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
142b0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65  ERR_UNLOCK;.  }e
142c0 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
142d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
142e0 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
142f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
14300 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
14310 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
14320 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
14330 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
14340 20 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21   {.  assert( id!
14350 3d 30 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c  =0 );.  flockUnl
14360 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
14370 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  ;.  return close
14380 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
14390 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
143a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
143b0 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
143c0 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
143d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
143e0 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
143f0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14400 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
14410 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14460 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
14470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144d0 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
144e0 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
144f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14500 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
14510 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
14520 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
14530 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
14540 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
14550 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
14560 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
14570 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
14580 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
14590 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
145a0 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
145b0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
145c0 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
145d0 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
145e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
145f0 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
14600 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
14610 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
14620 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
14630 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
14640 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
14650 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
14660 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14670 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
14680 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
14690 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
146a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
146b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
146c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
146d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
146e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
146f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
14700 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
14710 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
14720 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
14730 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
14740 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
14750 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
14760 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
14770 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
14780 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
14790 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
147a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
147b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
147c0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
147d0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
147e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
147f0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
14800 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14810 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14820 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14830 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14840 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14850 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
14860 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14870 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
14880 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
14890 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
148a0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
148b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
148c0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
148d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
148e0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
148f0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
14900 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
14910 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
14920 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
14930 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
14940 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
14950 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
14960 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
14970 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
14980 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
14990 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
149a0 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
149b0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
149c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
149d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
149e0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
149f0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
14a00 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
14a10 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
14a20 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
14a30 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
14a40 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f          /* someo
14a50 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
14a60 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65  lock when we are
14a70 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20   in NO_LOCK */. 
14a80 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
14a90 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  = (pFile->eFileL
14aa0 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43  ock < SHARED_LOC
14ab0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
14ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
14ad0 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
14ae0 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
14af0 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74  /.      sem_post
14b00 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSem);.    }.  
14b10 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
14b20 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14b30 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46   %d (sem)\n", pF
14b40 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14b50 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
14b60 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
14b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14b80 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
14b90 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
14ba0 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
14bb0 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
14bc0 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
14bd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
14be0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
14bf0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
14c00 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
14c10 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
14c20 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
14c30 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
14c40 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
14c50 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
14c60 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
14c70 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
14c80 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
14c90 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
14ca0 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
14cb0 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
14cc0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
14cd0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
14ce0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
14cf0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
14d00 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
14d10 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
14d20 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
14d30 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
14d40 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
14d50 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
14d60 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
14d70 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
14d80 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
14d90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
14da0 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
14db0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
14dc0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
14dd0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
14de0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14df0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
14e00 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14e10 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
14e20 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
14e30 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  VE.**.** Semapho
14e40 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65  re locks only re
14e50 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
14e60 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
14e70 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
14e80 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
14e90 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
14ea0 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
14eb0 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
14ec0 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
14ed0 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
14ee0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
14ef0 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
14f00 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
14f10 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
14f20 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
14f30 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
14f40 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
14f50 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
14f60 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
14f70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
14f80 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
14f90 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
14fa0 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c  int semXLock(sql
14fb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14fc0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
14fd0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14fe0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14ff0 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
15000 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
15010 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
15020 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
15030 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
15040 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
15050 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
15060 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
15070 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
15080 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
15090 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
150a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
150b0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
150c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
150d0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63  FileLock;.    rc
150e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
150f0 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
15100 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
15110 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
15120 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
15130 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
15140 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
15150 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
15160 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
15170 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
15180 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
15190 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
151a0 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
151b0 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
151c0 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
151d0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
151e0 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ock;.. sem_end_l
151f0 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
15200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
15210 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15220 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
15230 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
15240 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
15250 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
15260 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
15270 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
15280 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
15290 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
152a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
152b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
152c0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
152d0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
152e0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
152f0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
15310 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  emXUnlock(sqlite
15320 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15330 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
15340 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15350 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15360 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
15370 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
15380 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
15390 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
153a0 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
153b0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
153c0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
153d0 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
153e0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
153f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15400 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
15410 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
15420 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
15430 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
15440 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
15450 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
15460 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
15470 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
15480 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
154a0 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
154b0 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
154c0 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
154d0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
154e0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
154f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
15500 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
15510 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
15520 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
15530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15540 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
15550 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
15560 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
15570 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
15580 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
15590 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
155a0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
155b0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
155c0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
155d0 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
155e0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
155f0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
15600 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
15610 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
15620 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
15630 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
15640 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
15650 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
15660 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
15670 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
15680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15690 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  mXClose(sqlite3_
156a0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
156b0 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
156c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
156d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
156e0 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20   semXUnlock(id, 
156f0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
15700 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15710 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
15720 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
15730 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
15740 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
15750 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
15760 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
15770 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15780 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
15790 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
157a0 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
157b0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
157c0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
157d0 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
157e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
157f0 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
15800 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
15810 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15830 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15880 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
15890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
158d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
158e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
158f0 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
15900 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15920 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
15930 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
15940 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
15950 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
15960 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
15970 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
15980 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
15990 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
159a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
159b0 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
159c0 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
159d0 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
159e0 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
159f0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
15a00 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
15a10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
15a20 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
15a30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
15a40 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
15a50 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
15a60 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
15a70 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
15a80 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
15a90 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
15aa0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
15ab0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
15ac0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
15ad0 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
15ae0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
15af0 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b10 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
15b20 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
15b30 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
15b40 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
15b50 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
15b60 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
15b70 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
15b80 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
15b90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
15ba0 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
15bb0 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
15bc0 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
15bd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15be0 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
15bf0 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
15c00 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
15c10 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
15c20 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
15c30 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
15c40 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
15c50 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
15c60 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
15c70 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
15c80 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
15c90 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
15ca0 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
15cb0 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15cd0 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
15ce0 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
15cf0 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
15d00 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
15d10 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
15d20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
15d30 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
15d40 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
15d50 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
15d60 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
15d70 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
15d80 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
15d90 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
15da0 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
15db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15dc0 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
15dd0 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
15de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15df0 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
15e00 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
15e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15e20 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
15e30 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
15e40 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
15e50 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e70 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
15e80 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
15e90 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
15ea0 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
15eb0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
15ec0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
15ed0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15ee0 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
15ef0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15f00 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
15f10 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15f30 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
15f40 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
15f50 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
15f60 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
15f70 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
15f80 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
15f90 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
15fa0 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
15fb0 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
15fc0 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
15fd0 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
15fe0 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
15ff0 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
16000 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
16010 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
16020 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
16030 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
16040 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
16050 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
16060 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
16070 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
16080 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
16090 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
160a0 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
160b0 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
160c0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
160d0 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
160e0 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
160f0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
16100 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
16110 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
16120 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
16130 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
16140 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
16150 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
16160 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
16170 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
16180 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
16190 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
161a0 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
161b0 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
161c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
161d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
161e0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
16200 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
16210 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
16220 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
16230 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
16240 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
16250 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
16260 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
16270 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
16280 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
16290 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
162a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
162b0 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
162c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
162d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
162e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
162f0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
16300 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
16310 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
16320 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
16330 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
16340 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
16350 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
16360 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
16370 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
16380 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
16390 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
163a0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
163b0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
163c0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
163d0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
163e0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
163f0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
16400 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
16410 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
16420 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
16430 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16440 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
16450 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16460 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
16470 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
16480 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16490 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
164a0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
164b0 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
164c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
164d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
164e0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
164f0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
16500 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
16510 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
16520 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16530 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16540 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
16550 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
16560 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
16570 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
16580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16590 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
165a0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
165b0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
165c0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
165d0 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
165e0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
165f0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
16600 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
16610 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
16620 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
16630 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
16640 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
16650 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
16660 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
16670 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
16680 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
16690 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
166a0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
166b0 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
166c0 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
166d0 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
166e0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
166f0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
16700 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
16710 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
16720 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
16730 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
16740 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
16750 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
16760 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
16770 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
16780 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
16790 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
167a0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
167b0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
167c0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
167d0 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
167e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
167f0 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
16800 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
16810 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
16820 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
16830 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
16840 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
16850 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16860 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
16870 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
16880 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
16890 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
168a0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
168b0 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
168c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
168d0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
168e0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
168f0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
16900 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
16910 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
16920 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
16930 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
16940 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
16950 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
16960 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16970 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
16980 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
16990 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
169a0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
169b0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
169c0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
169d0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
169e0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
169f0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
16a00 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
16a10 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
16a20 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
16a30 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
16a40 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
16a50 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
16a60 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
16a70 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
16a80 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
16a90 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
16aa0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
16ab0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
16ac0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
16ad0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
16ae0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
16af0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
16b00 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
16b10 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
16b20 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
16b30 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
16b40 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
16b50 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
16b60 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
16b70 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
16b80 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
16b90 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
16ba0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
16bb0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
16bc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
16bd0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
16be0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
16bf0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
16c00 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
16c10 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
16c20 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
16c30 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
16c40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16c50 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
16c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16c70 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
16c80 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
16c90 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
16ca0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
16cb0 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
16cc0 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
16cd0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
16ce0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
16cf0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
16d00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
16d10 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
16d20 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
16d30 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
16d40 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
16d50 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
16d60 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
16d70 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
16d80 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
16d90 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
16da0 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
16db0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
16dc0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
16dd0 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
16de0 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  d , osGetpid(0))
16df0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
16e00 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
16e10 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
16e20 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
16e30 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
16e40 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
16e50 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
16e60 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
16e70 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
16e80 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
16e90 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
16ea0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
16eb0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16ec0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
16ed0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
16ee0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
16ef0 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
16f00 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
16f10 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
16f20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
16f30 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
16f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16f50 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
16f60 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
16f70 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
16f80 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
16f90 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
16fa0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
16fb0 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
16fc0 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
16fd0 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
16fe0 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
16ff0 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
17000 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
17010 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
17020 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
17030 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
17040 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
17050 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
17060 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
17070 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
17080 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
17090 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
170a0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
170b0 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
170c0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
170d0 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
170e0 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
170f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17100 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
17110 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
17120 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
17130 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
17140 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
17150 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
17160 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
17170 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
17180 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
17190 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
171a0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
171b0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
171c0 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
171d0 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
171e0 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
171f0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
17200 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
17210 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
17220 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
17230 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
17240 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
17250 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
17260 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
17270 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
17280 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
17290 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
172a0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
172b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
172c0 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
172d0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
172e0 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
172f0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
17300 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
17310 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
17320 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
17330 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
17340 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
17350 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
17360 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
17370 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17380 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
17390 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
173a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
173b0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
173c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
173d0 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
173e0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
173f0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17400 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17410 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
17420 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17430 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17440 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
17450 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
17460 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
17470 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
17480 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
17490 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
174a0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
174b0 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
174c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
174d0 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
174e0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
174f0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
17500 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
17510 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17520 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
17530 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
17540 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
17550 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
17560 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17570 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
17580 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
17590 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
175a0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
175b0 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
175c0 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
175d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
175e0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
175f0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17600 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
17610 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
17620 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
17630 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17640 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17650 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17660 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
17670 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
17680 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
17690 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
176a0 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
176b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
176c0 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
176d0 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
176e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
176f0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17700 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
17710 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
17720 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
17730 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
17740 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17750 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
17760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
17770 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
17780 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
17790 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
177a0 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
177b0 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
177c0 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
177d0 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
177e0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
177f0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
17800 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
17810 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
17820 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
17830 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
17840 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
17850 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
17860 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
17870 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
17880 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
17890 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
178a0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
178b0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
178c0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
178d0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
178e0 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
178f0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
17900 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
17910 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
17920 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
17930 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
17940 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
17950 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
17960 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
17970 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17980 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
17990 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
179a0 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
179b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
179c0 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
179d0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
179e0 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
179f0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
17a00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17a10 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17a20 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
17a30 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
17a40 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
17a50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
17a60 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
17a70 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
17a80 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
17a90 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
17aa0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
17ab0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
17ac0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
17ad0 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
17ae0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
17af0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17b00 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
17b10 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
17b20 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
17b30 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
17b40 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
17b50 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
17b60 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
17b70 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
17b80 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
17b90 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
17ba0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
17bb0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
17bc0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
17bd0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17be0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
17bf0 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
17c00 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
17c10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
17c20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
17c30 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
17c40 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
17c50 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
17c60 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
17c70 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
17c80 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
17c90 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
17ca0 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
17cb0 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
17cc0 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
17cd0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
17ce0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
17cf0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
17d00 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
17d10 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
17d20 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
17d30 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
17d40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17d50 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
17d60 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
17d70 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
17d80 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
17d90 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
17da0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17db0 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
17dc0 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
17dd0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
17de0 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
17df0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
17e00 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
17e10 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
17e20 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
17e30 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
17e40 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
17e50 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
17e60 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
17e70 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17e80 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
17e90 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
17ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17eb0 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
17ec0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17ed0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17ee0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
17f10 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17f20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
17f30 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
17f40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
17f50 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
17f60 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
17f70 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
17f80 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
17f90 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
17fa0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17fb0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
17fc0 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
17ff0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
18000 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
18010 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
18020 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18030 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
18060 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
18070 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
18080 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
18090 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
180a0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
180b0 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
180c0 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
180d0 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
180e0 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
180f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18100 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
18110 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  d & 0xff) == SQL
18120 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69  ITE_IOERR) ? fai
18130 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20  led2 : .        
18140 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
18150 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
18160 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
18170 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  _lock;.        }
18180 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
18190 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c         rc = fail
181a0 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed; .      }.   
181b0 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65   }.    if( faile
181c0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
181d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
181e0 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
181f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18200 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18210 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
18220 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
18230 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
18240 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
18250 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18260 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
18270 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18280 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
18290 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
182a0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
182b0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f  OCK;.  }.  .afp_
182c0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
182d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
182e0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
182f0 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29    %d %s %s (afp)
18300 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61  \n", pFile->h, a
18310 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
18320 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ock), .         
18330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
18340 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
18350 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18360 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
18370 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
18380 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
18390 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
183a0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
183b0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
183c0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
183d0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
183e0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
183f0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
18400 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
18410 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
18420 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
18430 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
18440 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
18450 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18470 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
18480 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
18490 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
184a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
184b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
184c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
184d0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
184e0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66  fo *pInode;.  af
184f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
18500 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
18510 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
18520 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
18530 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b  ontext;.  int sk
18540 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69  ipShared = 0;.#i
18550 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18560 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65  .  int h = pFile
18570 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ->h;.#endif..  a
18580 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
18590 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
185a0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
185b0 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
185c0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
185d0 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
185e0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
185f0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
18600 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
18610 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
18620 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
18630 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69 64          osGetpid
18640 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  (0)));..  assert
18650 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
18660 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
18670 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
18680 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck<=eFileLock ){
18690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
186a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
186b0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
186c0 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
186d0 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
186e0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
186f0 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
18700 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
18710 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
18720 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18730 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
18740 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
18750 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
18760 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18770 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18780 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
18790 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
187a0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
187b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
187c0 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e  EBUG.    /* When
187d0 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b   reducing a lock
187e0 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72   such that other
187f0 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73   processes can s
18800 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64  tart.    ** read
18810 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
18820 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b   file again, mak
18830 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  e sure that the.
18840 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
18850 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75  on counter was u
18860 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61  pdated if any pa
18870 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
18880 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  se.    ** file c
18890 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
188a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
188b0 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74  ter is not updat
188c0 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  ed,.    ** other
188d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
188e0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69  the same file mi
188f0 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  ght not realize 
18900 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
18910 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64  file has changed
18920 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74   and hence might
18930 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75   not know to flu
18940 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20  sh their.    ** 
18950 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20  cache.  The use 
18960 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65  of a stale cache
18970 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
18980 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
18990 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
189a0 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  ert( pFile->inNo
189b0 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20  rmalWrite==0.   
189c0 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
189d0 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20  ->dbUpdate==0.  
189e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
189f0 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
18a00 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ==1 );.    pFile
18a10 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
18a20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
18a30 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
18a40 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
18a50 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
18a60 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
18a70 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18a80 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45  th, pFile, SHARE
18a90 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
18aa0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  SIZE, 0);.      
18ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ac0 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
18ad0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
18ae0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18af0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
18b00 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69   only re-establi
18b10 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
18b20 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
18b30 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  */.        int s
18b40 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
18b50 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e  SHARED_FIRST+pIn
18b60 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b  ode->sharedByte;
18b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
18b80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18b90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18ba0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
18bb0 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20   1, 1);.      } 
18bc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
18bd0 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  kipShared = 1;. 
18be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18bf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18c00 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  OK && pFile->eFi
18c10 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
18c20 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
18c30 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18c40 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18c50 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
18c60 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  TE, 1, 0);.    }
18c70 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
18c80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
18c90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53  ->eFileLock>=RES
18ca0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f  ERVED_LOCK && co
18cb0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18cc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
18cd0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
18ce0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
18cf0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
18d00 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
18d10 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20   !rc ){ .       
18d20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
18d30 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d  ed = 0; .      }
18d40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18d60 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
18d70 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64  ED_LOCK || pInod
18d80 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a  e->nShared>1)){.
18d90 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
18da0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
18db0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
18dc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18dd0 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63  E_OK && eFileLoc
18de0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20  k==NO_LOCK ){.. 
18df0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
18e00 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
18e10 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
18e20 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
18e30 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
18e40 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
18e50 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
18e60 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
18e70 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
18e80 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
18e90 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
18ea0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
18eb0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
18ec0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
18ed0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
18ee0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18ef0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
18f00 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
18f10 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  {.      Simulate
18f20 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
18f30 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
18f40 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
18f50 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
18f60 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
18f70 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69  ;.      if( !ski
18f80 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20  pShared ){.     
18f90 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
18fa0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18fb0 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65  th, pFile, share
18fc0 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29  dLockByte, 1, 0)
18fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18fe0 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
18ff0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19000 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
19010 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
19020 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
19030 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
19040 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
19050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19060 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
19070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19080 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
19090 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
190a0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
190b0 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50  {.        closeP
190c0 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
190d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
190e0 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
190f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
19100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19110 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19120 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
19130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19140 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
19150 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20  e & cleanup AFP 
19160 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67  specific locking
19170 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61   context .*/.sta
19180 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65  tic int afpClose
19190 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
191a0 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
191b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
191c0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
191d0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
191e0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
191f0 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c  .  afpUnlock(id,
19200 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69   NO_LOCK);.  uni
19210 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
19220 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
19230 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  de && pFile->pIn
19240 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
19250 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
19260 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
19270 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
19280 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
19290 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
192a0 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
192b0 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
192c0 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
192d0 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
192e0 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
192f0 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50  or to pInode->aP
19300 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c  ending.  It will
19310 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
19320 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20  y closed when.  
19330 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
19340 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
19350 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e     */.    setPen
19360 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
19370 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64   }.  releaseInod
19380 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
19390 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
193a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
193b0 78 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  xt);.  rc = clos
193c0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
193d0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
193e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
193f0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
19400 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
19410 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
19420 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
19430 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
19440 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46   above is the AF
19450 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
19460 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
19470 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
19480 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
19490 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
194a0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
194b0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
194c0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
194d0 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f  able.  If you do
194e0 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20  n't compile for 
194f0 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20  a mac, then the 
19500 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46  "unix-afp".** VF
19510 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  S is not availab
19520 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
19530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
19540 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   of the AFP lock
19550 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
19560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19570 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
19580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195c0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
195d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19610 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f  *** Begin NFS Lo
19640 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
19650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19660 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66  ******/..#if def
19670 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
19680 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
19690 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
196a0 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  *. ** Lower the 
196b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
196c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
196d0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
196e0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
196f0 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
19700 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
19710 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
19720 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
19730 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
19740 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
19750 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
19760 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
19770 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
19780 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
19790 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
197a0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
197b0 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fsUnlock(sqlite3
197c0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
197d0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
197e0 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
197f0 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31  id, eFileLock, 1
19800 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
19810 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19820 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
19830 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
19840 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
19850 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
19860 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
19870 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
19880 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
19890 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
198a0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
198b0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
198c0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
198d0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
198e0 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  ailable.  .**.**
198f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19900 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e  *** End of the N
19910 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
19920 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
19930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
19940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
19990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
199e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
199f0 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  Non-locking sqli
19a00 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
19a10 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
19a30 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69  *.** The next di
19a40 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
19a50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
19a60 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20  for all methods 
19a70 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  of the .** sqlit
19a80 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f  e3_file object o
19a90 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  ther than the lo
19aa0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20  cking methods.  
19ab0 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d  The locking.** m
19ac0 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69  ethods were defi
19ad0 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73  ned in divisions
19ae0 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b   above (one lock
19af0 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a  ing method per.*
19b00 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68  * division).  Th
19b10 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  ose methods that
19b20 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   are common to a
19b30 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73  ll locking modes
19b40 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74  .** are gather t
19b50 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69  ogether into thi
19b60 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a  s division..*/..
19b70 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
19b80 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
19b90 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
19ba0 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
19bb0 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
19bc0 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
19bd0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19be0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
19bf0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
19c00 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
19c10 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
19c20 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
19c30 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
19c40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
19c50 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
19c60 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
19c70 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
19c80 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
19c90 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
19ca0 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
19cb0 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
19cc0 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d  D.** in any form
19cd0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
19ce0 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
19cf0 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
19d00 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65  N_SOURCE..** See
19d10 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61   tickets #2741 a
19d20 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20  nd #2681..**.** 
19d30 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
19d40 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
19d50 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65  e on a failed re
19d60 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  ad the lastErrno
19d70 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
19d80 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19d90 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
19da0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69   seekAndRead(uni
19db0 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  xFile *id, sqlit
19dc0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c  e3_int64 offset,
19dd0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
19de0 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
19df0 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20  ;.  int prior = 
19e00 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64  0;.#if (!defined
19e10 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21  (USE_PREAD) && !
19e20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19e30 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f  D64)).  i64 newO
19e40 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ffset;.#endif.  
19e50 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61  TIMER_START;.  a
19e60 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74  ssert( cnt==(cnt
19e70 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61  &0x1ffff) );.  a
19e80 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29  ssert( id->h>2 )
19e90 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
19ea0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19eb0 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
19ec0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19ed0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19ee0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19ef0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19f00 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19f10 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
19f20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
19f30 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
19f40 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
19f50 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
19f60 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
19f70 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
19f80 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
19f90 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
19fa0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19fb0 72 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d  r( newOffset = -
19fc0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  1 );.    if( new
19fd0 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  Offset<0 ){.    
19fe0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
19ff0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
1a000 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
1a010 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
1a020 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28     got = osRead(
1a030 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
1a040 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1a050 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65  ( got==cnt ) bre
1a060 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c  ak;.    if( got<
1a070 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
1a080 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67  rrno==EINTR ){ g
1a090 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65  ot = 1; continue
1a0a0 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20  ; }.      prior 
1a0b0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  = 0;.      store
1a0c0 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1a0d0 69 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29  ile*)id,  errno)
1a0e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a0f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74     }else if( got
1a100 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20  >0 ){.      cnt 
1a110 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66  -= got;.      of
1a120 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  fset += got;.   
1a130 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b     prior += got;
1a140 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76  .      pBuf = (v
1a150 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61  oid*)(got + (cha
1a160 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a  r*)pBuf);.    }.
1a170 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20    }while( got>0 
1a180 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  );.  TIMER_END;.
1a190 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
1a1a0 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c      %-3d %5d %7l
1a1b0 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20  ld %llu\n",.    
1a1c0 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67          id->h, g
1a1d0 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74  ot+prior, offset
1a1e0 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c  -prior, TIMER_EL
1a1f0 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72  APSED));.  retur
1a200 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a  n got+prior;.}..
1a210 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
1a220 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
1a230 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
1a240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1a250 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
1a260 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
1a270 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
1a280 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
1a290 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
1a2a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a2b0 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  ixRead(.  sqlite
1a2c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76  3_file *id, .  v
1a2d0 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
1a2e0 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
1a2f0 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b  _int64 offset.){
1a300 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1a310 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1a320 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  )id;.  int got;.
1a330 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1a340 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
1a350 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1a360 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20   amt>0 );..  /* 
1a370 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
1a380 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
1a390 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
1a3a0 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
1a3b0 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
1a3c0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
1a3d0 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
1a3e0 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
1a3f0 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
1a400 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
1a410 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f   pFile->pPreallo
1a420 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20  catedUnused==0. 
1a430 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1a440 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1a450 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1a460 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1a470 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1a480 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
1a490 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a4a0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1a4b0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
1a4c0 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
1a4d0 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
1a4e0 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
1a4f0 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
1a500 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
1a510 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
1a520 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
1a530 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
1a540 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
1a550 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1a560 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1a570 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
1a580 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1a590 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
1a5a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a5b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1a5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1a5d0 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d  nCopy = pFile->m
1a5e0 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
1a5f0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1a600 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1a610 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1a620 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
1a630 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
1a640 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
1a650 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
1a660 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
1a670 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
1a680 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a690 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
1a6a0 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
1a6b0 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1a6c0 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1a6d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a6e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1a6f0 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1a700 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1a710 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1a720 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1a730 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1a740 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1a750 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1a760 70 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20  pFile, 0);   /* 
1a770 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72  not a system err
1a780 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72  or */.    /* Unr
1a790 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
1a7a0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
1a7b0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
1a7c0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
1a7d0 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
1a7e0 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
1a7f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a800 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1a810 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
1a820 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65  empt to seek the
1a830 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
1a840 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1a850 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1a860 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66  .** absolute off
1a870 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61  set iOff, then a
1a880 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1a890 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61  nBuf bytes of da
1a8a0 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20  ta from.** pBuf 
1a8b0 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72  to it. If an err
1a8c0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
1a8d0 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69  n -1 and set *pi
1a8e0 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65  Errno. Otherwise
1a8f0 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  , .** return the
1a900 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
1a910 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
1a920 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65  (which may be le
1a930 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29  ss than.** nBuf)
1a940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a950 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a  seekAndWriteFd(.
1a960 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20    int fd,       
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1a990 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ptor to write to
1a9a0 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20   */.  i64 iOff, 
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66        /* File of
1a9d0 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72  fset to begin wr
1a9e0 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f  iting at */.  co
1a9f0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa10 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1aa20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74  this buffer to t
1aa30 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1aa40 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20   nBuf,          
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa60 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
1aa70 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Buf in bytes */.
1aa80 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20    int *piErrno  
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
1aab0 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20  number if error 
1aac0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1aad0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aaf0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1ab00 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   by system call 
1ab10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42  */..  assert( nB
1ab20 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66  uf==(nBuf&0x1fff
1ab30 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1ab40 66 64 3e 32 20 29 3b 0a 20 20 61 73 73 65 72 74  fd>2 );.  assert
1ab50 28 20 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a  ( piErrno!=0 );.
1ab60 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66    nBuf &= 0x1fff
1ab70 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  f;.  TIMER_START
1ab80 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  ;..#if defined(U
1ab90 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20  SE_PREAD).  do{ 
1aba0 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
1abb0 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1abc0 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65  f, iOff); }while
1abd0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1abe0 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
1abf0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1ac00 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  D64).  do{ rc = 
1ac10 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36 34 28  (int)osPwrite64(
1ac20 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1ac30 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20 72 63  iOff);}while( rc
1ac40 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1ac50 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b  TR);.#else.  do{
1ac60 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b 20 3d  .    i64 iSeek =
1ac70 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c   lseek(fd, iOff,
1ac80 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
1ac90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1aca0 20 69 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20   iSeek = -1 );. 
1acb0 20 20 20 69 66 28 20 69 53 65 65 6b 3c 30 20 29     if( iSeek<0 )
1acc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
1acd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ace0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 57    }.    rc = osW
1acf0 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e  rite(fd, pBuf, n
1ad00 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Buf);.  }while( 
1ad10 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1ad20 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  INTR );.#endif..
1ad30 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
1ad40 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20  STRACE(("WRITE  
1ad50 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
1ad60 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c  %llu\n", fd, rc,
1ad70 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41   iOff, TIMER_ELA
1ad80 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20 72  PSED));..  if( r
1ad90 63 3c 30 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  c<0 ) *piErrno =
1ada0 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e   errno;.  return
1adb0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1adc0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1add0 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
1ade0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
1adf0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
1ae00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1ae10 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1ae20 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
1ae30 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
1ae40 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1ae50 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1ae60 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1ae70 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
1ae80 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1ae90 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1aea0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1aeb0 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1aec0 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
1aed0 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
1aee0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1aef0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74   int cnt){.  ret
1af00 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65  urn seekAndWrite
1af10 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  Fd(id->h, offset
1af20 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64  , pBuf, cnt, &id
1af30 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a  ->lastErrno);.}.
1af40 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1af50 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1af60 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1af70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1af80 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1af90 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1afa0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1afb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1afc0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1afd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1afe0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1aff0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1b000 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1b010 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1b020 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1b030 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1b040 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1b050 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1b060 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1b070 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1b080 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1b090 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1b0a0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1b0b0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1b0c0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1b0d0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1b0e0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1b0f0 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1b100 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1b110 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1b120 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
1b130 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1b140 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1b150 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1b160 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1b170 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1b180 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1b190 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1b1a0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1b1b0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1b1c0 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1b1d0 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1b1e0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1b1f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1b200 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1b210 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1b220 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1b230 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1b240 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1b250 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1b260 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1b270 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1b280 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1b290 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1b2a0 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1b2b0 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1b2c0 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1b2d0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1b2e0 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1b2f0 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1b300 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1b310 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1b320 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1b330 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1b340 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1b350 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1b360 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1b370 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1b380 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b390 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1b3a0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1b3b0 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1b3c0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1b3d0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1b3e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b3f0 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1b400 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1b410 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1b420 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1b430 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1b440 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1b450 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1b460 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1b470 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1b480 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b490 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b4a0 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49  ITE_MMAP_READWRI
1b4b0 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41  TE) && SQLITE_MA
1b4c0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1b4d0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1b4e0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69  much of this wri
1b4f0 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  te request as po
1b500 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
1b510 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
1b520 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
1b530 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
1b540 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
1b550 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
1b560 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1b570 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1b580 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1b590 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1b5a0 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1b5b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1b5c0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d  ffset], pBuf, am
1b5d0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1b5e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1b600 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
1b610 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
1b620 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
1b630 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1b640 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1b650 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
1b660 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
1b670 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
1b680 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
1b690 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1b6a0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
1b6b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1b6c0 69 66 0a 20 0a 20 20 77 68 69 6c 65 28 20 28 77  if. .  while( (w
1b6d0 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72  rote = seekAndWr
1b6e0 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ite(pFile, offse
1b6f0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3c 61  t, pBuf, amt))<a
1b700 6d 74 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b  mt && wrote>0 ){
1b710 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74  .    amt -= wrot
1b720 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  e;.    offset +=
1b730 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
1b740 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
1b750 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
1b760 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1b770 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d  ( wrote=(-1), am
1b780 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61  t=1 ));.  Simula
1b790 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1b7a0 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31  ( wrote=0, amt=1
1b7b0 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e   ));..  if( amt>
1b7c0 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28  wrote ){.    if(
1b7d0 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c   wrote<0 && pFil
1b7e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e  e->lastErrno!=EN
1b7f0 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OSPC ){.      /*
1b800 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62   lastErrno set b
1b810 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a  y seekAndWrite *
1b820 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1b830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
1b840 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1b850 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1b860 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a  no(pFile, 0); /*
1b870 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
1b880 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
1b890 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1b8a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1b8b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b8c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1b8d0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
1b8e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b8f0 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
1b900 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
1b910 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1b920 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
1b930 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
1b940 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
1b950 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
1b960 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1b970 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
1b980 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
1b990 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
1b9a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
1b9b0 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
1b9c0 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
1b9d0 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
1b9e0 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
1b9f0 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
1ba00 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
1ba10 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
1ba20 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20  h the (slightly 
1ba30 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63  slower).** fsync
1ba40 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20  (). If you know 
1ba50 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d  that your system
1ba60 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64   does support fd
1ba70 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63  atasync() correc
1ba80 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d  tly,.** then sim
1ba90 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68  ply compile with
1baa0 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61   -Dfdatasync=fda
1bab0 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56 45  tasync or -DHAVE
1bac0 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69  _FDATASYNC.*/.#i
1bad0 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61  f !defined(fdata
1bae0 73 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f 46  sync) && !HAVE_F
1baf0 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
1bb00 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
1bb10 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
1bb20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
1bb30 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
1bb40 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
1bb50 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
1bb60 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
1bb70 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
1bb80 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
1bb90 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
1bba0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
1bbb0 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
1bbc0 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
1bbd0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
1bbe0 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
1bbf0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1bc00 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
1bc10 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1bc20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
1bc30 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
1bc40 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
1bc50 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
1bc60 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
1bc70 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
1bc80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1bc90 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
1bca0 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
1bcb0 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
1bcc0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1bcd0 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
1bce0 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
1bcf0 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
1bd00 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
1bd10 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
1bd20 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
1bd30 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1bd40 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
1bd50 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
1bd60 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
1bd70 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
1bd80 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
1bd90 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
1bda0 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
1bdb0 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
1bdc0 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
1bdd0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
1bde0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
1bdf0 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
1be00 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
1be10 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
1be20 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
1be30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1be40 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
1be50 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
1be60 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
1be70 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
1be80 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
1be90 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
1bea0 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
1beb0 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
1bec0 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
1bed0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1bee0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
1bef0 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
1bf00 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
1bf10 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
1bf20 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
1bf30 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
1bf40 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
1bf50 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
1bf60 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
1bf70 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
1bf80 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
1bf90 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
1bfa0 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
1bfb0 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
1bfc0 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
1bfd0 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
1bfe0 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
1bff0 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
1c000 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
1c010 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
1c020 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
1c030 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
1c040 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
1c050 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
1c060 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
1c070 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
1c080 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
1c090 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
1c0a0 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
1c0b0 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
1c0c0 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
1c0d0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1c0e0 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
1c0f0 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
1c100 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
1c110 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1c120 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
1c130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1c140 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
1c150 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
1c160 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
1c170 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
1c180 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
1c190 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
1c1a0 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
1c1b0 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
1c1c0 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
1c1d0 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
1c1e0 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
1c1f0 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
1c200 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
1c210 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
1c220 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
1c230 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
1c240 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1c250 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
1c260 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1c270 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1c280 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1c290 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c2a0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1c2b0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1c2c0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1c2d0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1c2e0 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
1c2f0 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1c300 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1c310 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1c320 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
1c330 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
1c340 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
1c350 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
1c360 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
1c370 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
1c380 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1c390 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
1c3a0 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
1c3b0 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
1c3c0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1c3d0 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
1c3e0 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
1c3f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1c400 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
1c410 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1c420 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
1c430 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
1c440 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1c450 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
1c460 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
1c470 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
1c480 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
1c490 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20 61  no-op.  But go a
1c4a0 68 65 61 64 20 61 6e 64 20 63 61 6c 6c 20 66 73  head and call fs
1c4b0 74 61 74 28 29 20 74 6f 20 76 61 6c 69 64 61 74  tat() to validat
1c4c0 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
1c4d0 64 65 73 63 72 69 70 74 6f 72 20 61 73 20 77 65  descriptor as we
1c4e0 20 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20 74   need a method t
1c4f0 6f 20 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c  o provoke a fail
1c500 75 72 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  ure during.  ** 
1c510 63 6f 76 65 72 61 74 65 20 74 65 73 74 69 6e 67  coverate testing
1c520 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1c530 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b  LITE_NO_SYNC.  {
1c540 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1c550 20 62 75 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f   buf;.    rc = o
1c560 73 46 73 74 61 74 28 66 64 2c 20 26 62 75 66 29  sFstat(fd, &buf)
1c570 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 48 41 56 45  ;.  }.#elif HAVE
1c580 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1c590 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1c5a0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1c5b0 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1c5c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c5d0 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1c5e0 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1c5f0 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1c600 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1c610 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1c620 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1c630 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1c640 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1c650 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1c660 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1c670 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1c680 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1c690 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1c6a0 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1c6b0 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1c6c0 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1c6d0 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1c6e0 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1c6f0 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1c700 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1c710 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1c720 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1c730 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1c740 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1c750 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1c760 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1c770 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1c780 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1c790 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1c7a0 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1c7b0 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1c7c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1c7d0 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1c7e0 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1c7f0 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1c800 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1c810 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1c820 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1c830 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1c840 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1c850 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1c860 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1c870 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1c880 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1c890 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1c8a0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1c8b0 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1c8c0 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1c8d0 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1c8e0 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1c8f0 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1c900 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1c910 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1c920 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1c930 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1c940 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1c950 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1c960 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c970 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1c980 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1c990 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1c9a0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1c9b0 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1c9c0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1c9d0 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1c9e0 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1c9f0 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1ca00 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1ca10 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1ca20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1ca30 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1ca40 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1ca50 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1ca60 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1ca70 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1ca80 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1ca90 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1caa0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1cab0 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1cac0 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1cad0 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1cae0 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1caf0 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1cb00 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1cb10 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1cb20 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1cb30 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1cb40 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1cb50 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1cb60 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1cb70 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1cb80 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1cb90 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1cba0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1cbb0 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1cbc0 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1cbd0 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1cbe0 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1cbf0 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1cc00 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1cc10 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1cc20 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1cc30 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1cc40 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1cc50 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1cc60 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1cc70 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1cc80 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1cc90 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1cca0 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1ccb0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1ccc0 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1ccd0 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1cce0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1ccf0 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1cd00 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1cd10 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1cd20 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1cd30 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1cd40 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1cd50 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1cd60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1cd70 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1cd80 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1cd90 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1cda0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1cdb0 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1cdc0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1cdd0 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1cde0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1cdf0 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1ce00 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1ce10 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1ce20 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1ce30 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1ce40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ce50 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1ce60 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1ce70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1ce80 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1ce90 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20  zDirname); ii>0 
1cea0 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1ceb0 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1cec0 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1ced0 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1cee0 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0';.  }else{.   
1cef0 20 69 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d   if( zDirname[0]
1cf00 21 3d 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65  !='/' ) zDirname
1cf10 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a  [0] = '.';.    z
1cf20 44 69 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a  Dirname[1] = 0;.
1cf30 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73    }.  fd = robus
1cf40 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c  t_open(zDirname,
1cf50 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41   O_RDONLY|O_BINA
1cf60 52 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64  RY, 0);.  if( fd
1cf70 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  >=0 ){.    OSTRA
1cf80 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1cf90 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1cfa0 72 6e 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a  rname));.  }.  *
1cfb0 70 46 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20  pFd = fd;.  if( 
1cfc0 66 64 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fd>=0 ) return S
1cfd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
1cfe0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1cff0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1d000 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63  BKPT, "openDirec
1d010 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29  tory", zDirname)
1d020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1d030 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1d040 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1d050 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1d060 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1d070 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1d080 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1d090 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1d0a0 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1d0b0 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1d0c0 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1d0d0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1d0e0 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1d0f0 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1d100 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1d110 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1d120 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1d130 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1d140 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1d150 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1d160 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1d170 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1d180 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1d190 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1d1a0 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1d1b0 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1d1c0 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1d1d0 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1d1e0 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1d1f0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1d200 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1d210 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1d220 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1d230 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1d240 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1d250 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1d260 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1d270 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1d280 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1d290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1d2a0 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1d2b0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1d2c0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1d2d0 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1d2e0 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1d2f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1d300 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1d310 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1d320 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1d330 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1d340 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1d350 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1d360 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1d370 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1d380 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1d390 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1d3a0 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1d3b0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1d3c0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1d3d0 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1d3e0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1d3f0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1d400 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1d410 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1d420 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1d430 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1d440 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1d450 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1d460 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1d470 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1d480 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1d490 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1d4a0 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1d4b0 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1d4c0 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1d4d0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1d4e0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1d4f0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1d500 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1d510 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1d520 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1d530 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1d540 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1d550 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1d560 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1d570 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1d580 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1d590 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1d5a0 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1d5b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1d5c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1d5d0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
1d5e0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1d5f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d600 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1d610 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1d620 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1d630 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1d640 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1d650 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1d660 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1d670 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1d680 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1d690 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1d6a0 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1d6b0 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1d6c0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1d6d0 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1d6e0 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1d6f0 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1d700 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1d710 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1d720 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1d730 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1d740 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1d750 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1d760 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1d770 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1d780 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1d790 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1d7a0 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1d7b0 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1d7c0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1d7d0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1d7e0 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1d7f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d800 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1d810 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20  (dirfd, 0, 0);. 
1d820 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1d830 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20  e(pFile, dirfd, 
1d840 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
1d850 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1d860 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
1d870 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
1d880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d890 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1d8a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1d8b0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1d8c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d8d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1d8e0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1d8f0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1d900 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1d910 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1d920 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d930 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1d940 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1d950 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1d960 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1d970 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1d980 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d990 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1d9a0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1d9b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1d9c0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1d9d0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1d9e0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1d9f0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1da00 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1da10 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1da20 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1da30 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1da40 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1da50 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1da60 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1da70 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1da80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1da90 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1daa0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1dab0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1dac0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1dad0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1dae0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1daf0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1db00 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1db10 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1db20 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
1db30 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1db40 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1db50 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1db60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1db70 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1db80 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1db90 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1dba0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1dbb0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
1dbc0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1dbd0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1dbe0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1dbf0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1dc00 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1dc10 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1dc20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1dc30 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1dc40 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1dc50 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1dc60 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1dc70 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1dc80 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1dc90 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1dca0 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1dcb0 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1dcc0 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1dcd0 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1dce0 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1dcf0 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1dd00 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1dd10 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1dd20 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1dd30 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1dd40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1dd50 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1dd60 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1dd70 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1dd80 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1dd90 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1dda0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1ddb0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1ddc0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1ddd0 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
1dde0 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
1ddf0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
1de00 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
1de10 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
1de20 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1de30 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
1de40 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
1de50 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
1de60 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
1de70 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
1de80 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
1de90 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
1dea0 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
1deb0 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
1dec0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1ded0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1dee0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
1def0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1df00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1df10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1df20 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1df30 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1df40 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1df50 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1df60 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1df70 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1df80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1df90 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1dfa0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1dfb0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
1dfc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1dfd0 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
1dfe0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1dff0 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
1e000 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1e010 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1e020 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1e030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e040 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1e050 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1e060 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1e070 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1e080 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1e090 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1e0a0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1e0b0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1e0c0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1e0d0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1e0e0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1e0f0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1e100 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1e110 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1e120 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1e130 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1e140 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1e150 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1e160 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1e170 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1e180 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1e190 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1e1a0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1e1b0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1e1c0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1e1d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e1e0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1e1f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1e200 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1e210 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1e220 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1e230 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1e240 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1e250 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1e260 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1e270 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1e280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e290 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1e2a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1e2b0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1e2c0 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1e2d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e2e0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1e2f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1e300 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1e310 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1e320 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
1e330 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
1e340 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
1e350 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
1e360 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
1e370 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
1e380 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
1e390 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
1e3a0 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
1e3b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1e3c0 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
1e3d0 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
1e3e0 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
1e3f0 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
1e400 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1e410 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1e440 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1e450 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e470 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1e480 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1e490 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1e4a0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1e4b0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
1e4c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e4d0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1e4e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a  .    }..    nSiz
1e4f0 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c  e = ((nByte+pFil
1e500 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20  e->szChunk-1) / 
1e510 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1e520 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1e530 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
1e540 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65  (i64)buf.st_size
1e550 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   ){..#if defined
1e560 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
1e570 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
1e580 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
1e590 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1e5a0 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69   below is handli
1e5b0 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
1e5c0 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61  lue of osFalloca
1e5d0 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63  te() .      ** c
1e5e0 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f  orrectly. posix_
1e5f0 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64  fallocate() is d
1e600 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72  efined to "retur
1e610 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  ns zero on succe
1e620 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ss, .      ** or
1e630 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72   an error number
1e640 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53   on  failure". S
1e650 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66  ee the manpage f
1e660 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1e670 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20       int err;.  
1e680 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
1e690 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74  err = osFallocat
1e6a0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e  e(pFile->h, buf.
1e6b0 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62  st_size, nSize-b
1e6c0 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
1e6d0 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d     }while( err==
1e6e0 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69  EINTR );.      i
1e6f0 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e 20  f( err ) return 
1e700 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e710 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  TE;.#else.      
1e720 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65  /* If the OS doe
1e730 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78  s not have posix
1e740 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61  _fallocate(), fa
1e750 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a  ke it. Write a .
1e760 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
1e770 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74  byte to the last
1e780 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
1e790 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65  ock that falls e
1e7a0 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a  ntirely.      **
1e7b0 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1e7c0 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65  nded region. The
1e7d0 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c 20  n, if required, 
1e7e0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
1e7f0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
1e800 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73   (nSize-1), to s
1e810 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
1e820 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c  he file correctl
1e830 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  y..      ** This
1e840 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65   is a similar te
1e850 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20  chnique to that 
1e860 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e  used by glibc on
1e870 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a   systems.      *
1e880 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  * that do not ha
1e890 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1e8a0 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20  ate() call..    
1e8b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1e8c0 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1e8d0 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1e8e0 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1e8f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57   */.      int nW
1e900 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rite = 0;       
1e910 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e920 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1e930 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
1e940 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1e950 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1e960 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1e970 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1e980 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74   */..      iWrit
1e990 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69 7a 65  e = (buf.st_size
1e9a0 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42  /nBlk)*nBlk + nB
1e9b0 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  lk - 1;.      as
1e9c0 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75  sert( iWrite>=bu
1e9d0 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20  f.st_size );.   
1e9e0 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72     assert( ((iWr
1e9f0 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20  ite+1)%nBlk)==0 
1ea00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e  );.      for(/*n
1ea10 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e  o-op*/; iWrite<n
1ea20 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72  Size+nBlk-1; iWr
1ea30 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20  ite+=nBlk ){.   
1ea40 20 20 20 20 20 69 66 28 20 69 57 72 69 74 65 3e       if( iWrite>
1ea50 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74 65 20  =nSize ) iWrite 
1ea60 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20  = nSize - 1;.   
1ea70 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
1ea80 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1ea90 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1eaa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1eab0 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1eac0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1ead0 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ITE;.      }.#en
1eae0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  dif.    }.  }..#
1eaf0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1eb00 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
1eb10 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1eb20 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46  ax>0 && nByte>pF
1eb30 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1eb40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1eb50 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1eb60 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk<=0 ){.      
1eb70 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1eb80 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1eb90 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
1eba0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1ebb0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1ebc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
1ebd0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1ebe0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1ebf0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1ec00 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1ec10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ec20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1ec30 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  e(pFile, nByte);
1ec40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ec50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1ec60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ec70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
1ec80 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  g is initially n
1ec90 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
1eca0 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
1ecb0 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
1ecc0 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
1ecd0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1ece0 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
1ecf0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
1ed00 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
1ed10 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
1ed20 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
1ed30 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
1ed40 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1ed50 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
1ed60 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28  oid unixModeBit(
1ed70 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1ed80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
1ed90 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
1eda0 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
1edb0 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
1edc0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1edd0 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
1ede0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
1edf0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
1ee00 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
1ee10 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1ee20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1ee30 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
1ee40 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1ee50 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
1ee60 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
1ee70 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
1ee80 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
1ee90 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1eea0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1eeb0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1eec0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1eed0 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1eee0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1eef0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1ef00 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
1ef10 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1ef20 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1ef30 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 23 69  switch( op ){.#i
1ef40 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
1ef50 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
1ef60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
1ef70 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
1ef80 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1ef90 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54  E_FCNTL_BEGIN_AT
1efa0 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20  OMIC_WRITE: {.  
1efb0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49      int rc = osI
1efc0 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  octl(pFile->h, F
1efd0 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54  2FS_IOC_START_AT
1efe0 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20  OMIC_WRITE);.   
1eff0 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53     return rc ? S
1f000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45 47 49  QLITE_IOERR_BEGI
1f010 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54  N_ATOMIC : SQLIT
1f020 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f030 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f040 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f  L_COMMIT_ATOMIC_
1f050 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69  WRITE: {.      i
1f060 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28  nt rc = osIoctl(
1f070 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49  pFile->h, F2FS_I
1f080 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43  OC_COMMIT_ATOMIC
1f090 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72  _WRITE);.      r
1f0a0 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
1f0b0 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41  E_IOERR_COMMIT_A
1f0c0 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f  TOMIC : SQLITE_O
1f0d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1f0e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  e SQLITE_FCNTL_R
1f0f0 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57  OLLBACK_ATOMIC_W
1f100 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RITE: {.      in
1f110 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70  t rc = osIoctl(p
1f120 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f  File->h, F2FS_IO
1f130 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45  C_ABORT_VOLATILE
1f140 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72  _WRITE);.      r
1f150 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
1f160 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b  E_IOERR_ROLLBACK
1f170 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45  _ATOMIC : SQLITE
1f180 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1f190 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26  f /* __linux__ &
1f1a0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1f1b0 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49  BATCH_ATOMIC_WRI
1f1c0 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  TE */..    case 
1f1d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1f1e0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1f1f0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1f200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
1f210 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f220 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f230 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f240 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
1f250 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1f260 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
1f270 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
1f280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f290 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1f2a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
1f2b0 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
1f2c0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
1f2d0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
1f2e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f2f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f300 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f310 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1f320 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1f330 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1f340 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1f350 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
1f360 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
1f370 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
1f380 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1f390 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1f3a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f3b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1f3c0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
1f3d0 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75  T_WAL: {.      u
1f3e0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1f3f0 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  , UNIXFILE_PERSI
1f400 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
1f410 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
1f420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f430 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f440 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
1f450 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
1f460 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
1f470 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
1f480 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
1f490 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
1f4a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f4b0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f4c0 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
1f4d0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
1f4e0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1f4f0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1f500 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
1f510 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1f520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f530 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f540 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
1f550 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
1f560 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71  har *zTFile = sq
1f570 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
1f580 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
1f590 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20  athname );.     
1f5a0 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20   if( zTFile ){. 
1f5b0 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65         unixGetTe
1f5c0 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
1f5d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
1f5e0 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  zTFile);.       
1f5f0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1f600 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
1f610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f630 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f640 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20  CNTL_HAS_MOVED: 
1f650 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1f660 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76  Arg = fileHasMov
1f670 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ed(pFile);.     
1f680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f690 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  K;.    }.#if SQL
1f6a0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1f6b0 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
1f6c0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
1f6d0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
1f6e0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
1f6f0 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
1f700 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f710 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
1f720 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
1f730 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1f740 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
1f750 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
1f760 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1f770 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  p;.      }..    
1f780 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1f790 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62  f newLimit may b
1f7a0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73  e eventually cas
1f7b0 74 20 74 6f 20 28 73 69 7a 65 5f 74 29 20 61 6e  t to (size_t) an
1f7c0 64 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a  d passed.      *
1f7d0 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20 52 65 73  * to mmap(). Res
1f7e0 74 72 69 63 74 20 69 74 73 20 76 61 6c 75 65 20  trict its value 
1f7f0 74 6f 20 32 47 42 20 69 66 20 28 73 69 7a 65 5f  to 2GB if (size_
1f800 74 29 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61  t) is not at lea
1f810 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 36 34  st a.      ** 64
1f820 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20  -bit type. */.  
1f830 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
1f840 3e 30 20 26 26 20 73 69 7a 65 6f 66 28 73 69 7a  >0 && sizeof(siz
1f850 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20 20 20 20  e_t)<8 ){.      
1f860 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65    newLimit = (ne
1f870 77 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46 46  wLimit & 0x7FFFF
1f880 46 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  FFF);.      }.. 
1f890 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67       *(i64*)pArg
1f8a0 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1f8b0 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28  zeMax;.      if(
1f8c0 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20   newLimit>=0 && 
1f8d0 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d  newLimit!=pFile-
1f8e0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20  >mmapSizeMax && 
1f8f0 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74  pFile->nFetchOut
1f900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1f910 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1f920 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 23 69  x = newLimit;.#i
1f930 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 41 52  fdef SQLITE_SHAR
1f940 45 44 5f 4d 41 50 50 49 4e 47 0a 20 20 20 20 20  ED_MAPPING.     
1f950 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
1f960 6e 6f 64 65 3d 3d 30 20 29 0a 23 65 6e 64 69 66  node==0 ).#endif
1f970 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1f980 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1f990 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
1f9a0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
1f9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f9c0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1f9d0 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
1f9e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fa00 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1fa10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1fa20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1fa30 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1fa40 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1fa50 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1fa60 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1fa70 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1fa80 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1fa90 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1faa0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1fab0 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1fac0 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1fad0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1fae0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1faf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1fb00 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1fb10 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1fb20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1fb30 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1fb40 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1fb50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1fb60 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1fb70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1fb80 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1fb90 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1fba0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1fbb0 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
1fbc0 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1fbd0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
1fbe0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1fbf0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1fc00 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1fc10 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1fc20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1fc30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1fc40 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1fc50 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1fc60 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1fc70 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1fc80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 64  .}../*.** If pFd
1fc90 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1fca0 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68  non-zero when th
1fcb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1fcc0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a  alled, it is a.*
1fcd0 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
1fce0 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f  se, the values o
1fcf0 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
1fd00 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d 3e 64  e and .** pFd->d
1fd10 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1fd20 74 69 63 73 20 61 72 65 20 73 65 74 20 61 63 63  tics are set acc
1fd30 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69  ording to the fi
1fd40 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 63 68  le-system .** ch
1fd50 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 20 0a  aracteristics. .
1fd60 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
1fd70 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
1fd80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
1fd90 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64 20 6f  ne for QNX and o
1fda0 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6f 74  ne for all.** ot
1fdb0 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  her systems..*/.
1fdc0 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
1fdd0 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  __.static void s
1fde0 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
1fdf0 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65  ristics(unixFile
1fe00 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
1fe10 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61  ( pFd->deviceCha
1fe20 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d 30 20  racteristics==0 
1fe30 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69  || pFd->sectorSi
1fe40 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze!=0 );.  if( p
1fe50 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d  Fd->sectorSize==
1fe60 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  0 ){.#if defined
1fe70 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
1fe80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1fe90 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
1fea0 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69 6e 74  C_WRITE).    int
1feb0 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20 66 20   res;.    u32 f 
1fec0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  = 0;..    /* Che
1fed0 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 20 66  ck for support f
1fee0 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63 20 62  or F2FS atomic b
1fef0 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a 2f 0a  atch writes. */.
1ff00 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f 63 74      res = osIoct
1ff10 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53 5f 49  l(pFd->h, F2FS_I
1ff20 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 2c  OC_GET_FEATURES,
1ff30 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20 72 65   &f);.    if( re
1ff40 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46 32 46  s==0 && (f & F2F
1ff50 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d 49 43  S_FEATURE_ATOMIC
1ff60 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
1ff70 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
1ff80 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 53 51  acteristics = SQ
1ff90 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
1ffa0 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d 0a 23  _ATOMIC;.    }.#
1ffb0 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78  endif /* __linux
1ffc0 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  __ && SQLITE_ENA
1ffd0 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
1ffe0 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 2f  _WRITE */..    /
1fff0 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45 52 53  * Set the POWERS
20000 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  AFE_OVERWRITE fl
20010 61 67 20 69 66 20 72 65 71 75 65 73 74 65 64 2e  ag if requested.
20020 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 64 2d   */.    if( pFd-
20030 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
20040 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
20050 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
20060 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 7c  haracteristics |
20070 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  = SQLITE_IOCAP_P
20080 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20090 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  TE;.    }..    p
200a0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  Fd->sectorSize =
200b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
200c0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
200d0 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64  .}.#else.#includ
200e0 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e  e <sys/dcmd_blk.
200f0 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
20100 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61 74  /statvfs.h>.stat
20110 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69 63  ic void setDevic
20120 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20130 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
20140 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
20150 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20  sectorSize == 0 
20160 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
20170 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  atvfs fsInfo;.  
20180 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74       .    /* Set
20190 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f   defaults for no
201a0 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65  n-supported file
201b0 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70  systems */.    p
201c0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
201d0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
201e0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
201f0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
20200 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
20210 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74  = 0;.    if( fst
20220 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20  atvfs(pFile->h, 
20230 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
20240 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
20250 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
20260 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
20270 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
20280 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d  .f_basetype, "tm
20290 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  p") ) {.      pF
202a0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
202b0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
202c0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
202d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
202e0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
202f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20300 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20  IC4K |       /* 
20310 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74  All ram filesyst
20320 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
20330 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
20340 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
20350 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
20360 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
20370 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
20380 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
203b0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
203c0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
203d0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
203e0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
203f0 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
20400 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
20410 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
20440 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
20450 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
20460 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
20470 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
20480 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b  type, "etfs") ){
20490 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
204a0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
204b0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
204c0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
204d0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
204e0 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20          /* etfs 
204f0 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69  cluster size wri
20500 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
20510 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65  /.        (pFile
20520 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
20530 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
20540 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20  P_ATOMIC512) |. 
20550 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20560 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
20570 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
20580 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
20590 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur 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 20                  
205c0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
205d0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
205e0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
205f0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
20600 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
20610 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
20620 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write 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 20 20                  
20650 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
20660 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
20670 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
20680 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
20690 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
206a0 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx6") ){.      p
206b0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
206c0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
206d0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
206e0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
206f0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
20700 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20710 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a  MIC |         /*
20720 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20   All filesystem 
20730 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
20740 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
20750 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
20760 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
20770 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
20780 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
20790 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
207c0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
207d0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
207e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
207f0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
20800 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
20810 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
20820 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
20850 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
20860 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
20870 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
20880 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
20890 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20  pe, "qnx4") ){. 
208a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
208b0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
208c0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
208d0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
208e0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
208f0 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
20900 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
20910 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
20920 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
20930 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
20940 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20950 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
20960 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
20970 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
20980 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
20990 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
209a0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
209b0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
209c0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
20a00 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
20a10 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
20a20 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
20a30 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73  f_basetype, "dos
20a40 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
20a50 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
20a60 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
20a70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
20a80 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20a90 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
20aa0 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
20ab0 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
20ac0 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
20ad0 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
20ae0 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
20af0 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
20b00 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
20b10 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
20b20 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
20b30 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
20b40 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
20b50 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
20b60 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
20b70 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
20ba0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
20bb0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
20bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
20bd0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20be0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
20bf0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20c00 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20  ATOMIC512 |     
20c10 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61   /* blocks are a
20c20 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
20c30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
20c40 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
20c50 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
20c60 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
20c70 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20ca0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
20cb0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  eds */.        0
20cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
20cd0 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72   Last chance ver
20ce0 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74  ification.  If t
20cf0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
20d00 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20  sn't a multiple 
20d10 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e  of 512.  ** then
20d20 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e   it isn't valid.
20d30 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
20d40 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32  sectorSize % 512
20d50 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   != 0 ){.    pFi
20d60 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
20d70 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
20d80 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
20d90 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
20da0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
20db0 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  E;.  }.}.#endif.
20dc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20dd0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
20de0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
20df0 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
20e00 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
20e10 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
20e20 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
20e30 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
20e40 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
20e50 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
20e60 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
20e70 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
20e80 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
20e90 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
20ea0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
20eb0 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
20ec0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
20ed0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
20ee0 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
20ef0 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
20f00 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
20f10 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
20f20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
20f30 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
20f40 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
20f50 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20f60 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
20f70 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
20f80 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
20f90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
20fa0 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
20fb0 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a  teristics(pFd);.
20fc0 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65    return pFd->se
20fd0 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  ctorSize;.}../*.
20fe0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
20ff0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
21000 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
21010 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
21020 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
21030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
21040 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
21050 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
21060 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
21070 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
21080 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
21090 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
210a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
210b0 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
210c0 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
210d0 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
210e0 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
210f0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
21100 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
21110 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
21120 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
21130 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
21140 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
21150 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
21160 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
21170 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
21180 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
21190 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
211a0 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
211b0 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
211c0 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
211d0 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
211e0 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
211f0 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
21200 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
21210 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
21220 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
21230 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
21240 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
21250 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
21260 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
21270 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
21280 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
21290 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
212a0 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
212b0 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
212c0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
212d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
212e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
212f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
21300 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
21310 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61  ;.  setDeviceCha
21320 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64  racteristics(pFd
21330 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d  );.  return pFd-
21340 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
21350 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21  istics;.}..#if !
21360 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21370 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
21380 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
21390 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
213a0 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
213b0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
213c0 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
213d0 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
213e0 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
213f0 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
21400 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
21410 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
21420 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
21430 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
21440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21450 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
21460 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
21470 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
21480 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
21490 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
214a0 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
214b0 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
214c0 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
214d0 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
214e0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
214f0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
21500 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
21510 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
21520 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
21530 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21540 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
21550 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
21560 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
21570 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
21580 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
21590 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
215a0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
215b0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
215c0 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
215d0 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
215e0 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
215f0 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
21600 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
21610 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
21620 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
21630 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
21640 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
21650 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
21660 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
21670 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
21680 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21690 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
216a0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
216b0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
216c0 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
216d0 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
216e0 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
216f0 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
21700 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
21710 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
21720 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
21730 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
21740 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
21750 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
21760 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
21770 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
21780 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
21790 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
217a0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
217b0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
217c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
217d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
217e0 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
217f0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21800 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
21810 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
21820 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
21830 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
21840 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
21850 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
21860 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
21870 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
21880 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
21890 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
218a0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
218b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
218c0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
218d0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
218e0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
218f0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
21900 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
21910 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
21920 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
21930 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
21940 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
21950 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
21960 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
21970 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
21980 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
21990 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
219a0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
219b0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
219c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
219d0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
219e0 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
219f0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
21a00 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
21a10 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
21a20 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
21a30 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
21a40 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
21a50 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
21a60 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
21a70 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
21a80 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
21a90 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ab0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
21ac0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
21ad0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
21ae0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21af0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
21b00 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
21b10 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
21b20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21b30 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
21b40 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
21b50 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
21b60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
21b70 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
21b80 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
21b90 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21ba0 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
21bb0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
21bc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
21bf0 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
21c00 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
21c10 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
21c20 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
21c30 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
21c40 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
21c50 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
21c60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21c70 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
21c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21c90 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
21ca0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
21cb0 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
21cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
21cd0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
21ce0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
21cf0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
21d00 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
21d10 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
21d20 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
21d30 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
21d40 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
21d50 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
21d60 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
21d70 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
21d80 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
21d90 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
21da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
21db0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
21dc0 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
21dd0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
21de0 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
21df0 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
21e00 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
21e10 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
21e20 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
21e30 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
21e40 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
21e50 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
21e60 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
21e70 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
21e80 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
21e90 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
21ea0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
21eb0 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
21ec0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
21ed0 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
21ee0 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
21ef0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
21f00 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
21f10 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
21f20 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
21f30 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
21f40 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
21f50 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
21f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21f70 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
21f80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
21f90 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
21fc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
21fd0 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
21fe0 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
21ff0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
22000 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
22010 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
22020 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
22030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22040 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
22050 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
22060 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
22070 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
22080 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
22090 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
220a0 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
220b0 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
220c0 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
220d0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
220e0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
220f0 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
22100 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
22110 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
22120 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
22130 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
22140 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
22150 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
22160 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
22170 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
22180 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
22190 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
221a0 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
221b0 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
221c0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
221d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
221e0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
221f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
22200 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
22210 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
22220 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
22230 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
22240 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
22250 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
22260 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
22270 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
22280 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
22290 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
222a0 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
222d0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
222e0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
222f0 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
22300 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
22310 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
22320 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
22330 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
22340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22350 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
22360 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
22370 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
22380 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
22390 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
223a0 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
223b0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
223c0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
223d0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
223e0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
223f0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
22400 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
22410 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
22420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22430 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
22440 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
22450 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
22460 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
22470 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
22480 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
22490 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
224a0 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
224b0 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
224c0 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
224d0 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
224e0 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c  ( n>=1 && n<=SQL
224f0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
22500 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
22510 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->h>=0 ){.    /*
22520 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
22530 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
22540 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  rs */.    memset
22550 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
22560 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65  ));.    f.l_type
22570 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20   = lockType;.   
22580 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45   f.l_whence = SE
22590 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f  EK_SET;.    f.l_
225a0 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20  start = ofst;.  
225b0 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a    f.l_len = n;..
225c0 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
225d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f  (pShmNode->h, F_
225e0 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20  SETLK, &f);.    
225f0 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20  rc = (rc!=(-1)) 
22600 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
22610 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
22620 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
22630 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74  global lock stat
22640 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74  e and do debug t
22650 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66  racing */.#ifdef
22660 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
22670 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53  { u16 mask;.  OS
22680 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
22690 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f   "));.  mask = o
226a0 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20  fst>31 ? 0xffff 
226b0 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  : (1<<(ofst+n)) 
226c0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
226d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
226e0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
226f0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
22700 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22710 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
22720 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
22730 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
22740 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
22750 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
22760 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
22770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
22780 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
22790 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
227a0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
227b0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
227c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
227d0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
227e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
227f0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
22800 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
22810 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
22820 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
22830 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22840 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
22850 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
22860 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
22870 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
22880 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
22890 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
228a0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
228b0 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
228c0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
228d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
228e0 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
228f0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
22900 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
22910 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
22920 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
22930 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
22940 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22950 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
22960 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
22970 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22980 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
22990 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
229a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
229b0 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
229c0 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
229d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
229e0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
229f0 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
22a00 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
22a10 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
22a20 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a  ;        .}../*.
22a30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69  ** Return the mi
22a40 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
22a50 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73  32KB shm regions
22a60 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
22a70 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74  mapped at.** a t
22a80 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ime, assuming th
22a90 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  at each mapping 
22aa0 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67  must be an integ
22ab0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
22ac0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79  he.** current sy
22ad0 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a  stem page-size..
22ae0 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74  **.** Usually, t
22af0 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78  his is 1. The ex
22b00 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f  ception seems to
22b10 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74   be systems that
22b20 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a   are configured.
22b30 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70  ** to use 64KB p
22b40 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63  ages - in this c
22b50 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67  ase each mapping
22b60 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c   must cover at l
22b70 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20  east two.** shm 
22b80 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  regions..*/.stat
22b90 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65  ic int unixShmRe
22ba0 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29  gionPerMap(void)
22bb0 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20  {.  int shmsz = 
22bc0 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20  32*1024;        
22bd0 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f      /* SHM regio
22be0 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  n size */.  int 
22bf0 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65  pgsz = osGetpage
22c00 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73  size();   /* Sys
22c10 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tem page size */
22c20 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73  .  assert( ((pgs
22c30 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b  z-1)&pgsz)==0 );
22c40 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
22c50 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
22c60 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67  of 2 */.  if( pg
22c70 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72  sz<shmsz ) retur
22c80 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67  n 1;.  return pg
22c90 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a  sz/shmsz;.}../*.
22ca0 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69  ** Purge the uni
22cb0 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  xShmNodeList lis
22cc0 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
22cd0 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64   with unixShmNod
22ce0 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
22cf0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
22d00 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
22d10 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
22d20 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
22d30 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
22d40 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
22d50 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
22d60 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
22d70 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a  Purge(unixFile *
22d80 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  pFd){.  unixShmN
22d90 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49  ode *p = pFd->pI
22da0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
22db0 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
22dc0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69  texHeld() );.  i
22dd0 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
22de0 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20  ->nRef==0) ){.  
22df0 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
22e00 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
22e10 50 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e  PerMap();.    in
22e20 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
22e30 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d   p->pInode==pFd-
22e40 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73  >pInode );.    s
22e50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
22e60 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
22e70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
22e80 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50  Region; i+=nShmP
22e90 65 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66  erMap){.      if
22ea0 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ( p->h>=0 ){.   
22eb0 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d       osMunmap(p-
22ec0 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d  >apRegion[i], p-
22ed0 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >szRegion);.    
22ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22ef0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
22f00 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20  >apRegion[i]);. 
22f10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22f20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
22f30 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  >apRegion);.    
22f40 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20  if( p->h>=0 ){. 
22f50 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
22f60 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c  e(pFd, p->h, __L
22f70 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d  INE__);.      p-
22f80 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  >h = -1;.    }. 
22f90 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53     p->pInode->pS
22fa0 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  hmNode = 0;.    
22fb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
22fc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
22fd0 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  en a shared-memo
22fe0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
22ff0 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74  ed with open dat
23000 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
23010 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74  .  .** This part
23020 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74  icular implement
23030 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70  ation uses mmapp
23040 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
23050 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  The file used to
23060 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65   implement share
23070 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74  d-memory is in t
23080 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
23090 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e  y.** as the open
230a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
230b0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
230c0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e  name as the open
230d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
230e0 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d  e with the "-shm
230f0 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20  " suffix added. 
23100 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
23110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23120 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f  le.** is "/home/
23130 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22  user1/config.db"
23140 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74   then the file t
23150 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61  hat is created a
23160 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f  nd mmapped.** fo
23170 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
23180 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22  will be called "
23190 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
231a0 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a  ig.db-shm".  .**
231b0 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72  .** Another appr
231c0 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73  oach to is to us
231d0 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f  e files in /dev/
231e0 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20  shm or /dev/tmp 
231f0 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74  or an.** some ot
23200 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e  her tmpfs mount.
23210 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69   But if a file i
23220 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
23230 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20  rectory.** from 
23240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23250 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  e is used, then 
23260 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73  differing access
23270 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
23280 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69  or a chroot() mi
23290 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69  ght cause two di
232a0 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65  fferent processe
232b0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  s on the same.**
232c0 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64   database to end
232d0 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72   up using differ
232e0 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68  ent files for sh
232f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a  ared memory - .*
23300 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74  * meaning that t
23310 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c  heir memory woul
23320 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  d not really be 
23330 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69  shared - resulti
23340 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73  ng.** in databas
23350 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e  e corruption.  N
23360 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69  evertheless, thi
23370 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61  s tmpfs file usa
23380 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61  ge.** can be ena
23390 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
233a0 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c  time using -DSQL
233b0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
233c0 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20  Y="/dev/shm".** 
233d0 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
233e0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74  t.  The use of t
233f0 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  he SQLITE_SHM_DI
23400 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d  RECTORY compile-
23410 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72  time.** option r
23420 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63  esults in an inc
23430 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20  ompatible build 
23440 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c  of SQLite;  buil
23450 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20  ds of SQLite.** 
23460 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72  that with differ
23470 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  ing SQLITE_SHM_D
23480 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67  IRECTORY setting
23490 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  s attempt to use
234a0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74   the.** same dat
234b0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
234c0 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74  e same time, dat
234d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
234e0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
234f0 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49  result. The SQLI
23500 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23510 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
23520 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72  tion is consider
23530 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74  ed.** "unsupport
23540 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61  ed" and may go a
23550 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20  way in a future 
23560 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a  SQLite release..
23570 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
23580 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
23590 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
235a0 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
235b0 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
235c0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
235d0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
235e0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
235f0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
23600 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
23610 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
23620 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
23630 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
23640 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  er cleared..**.*
23650 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
23660 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
23670 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67  (pDbFd) is using
23680 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22   the "unix-excl"
23690 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61   VFS.** that mea
236a0 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75  ns that an exclu
236b0 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c  sive lock is hel
236c0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
236d0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
236e0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
236f0 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74  esses are able t
23700 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
23710 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
23720 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20  n.** that case, 
23730 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  we do not really
23740 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d   need shared mem
23750 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20  ory.  No shared 
23760 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69  memory.** file i
23770 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
23780 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
23790 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20  ll be simulated 
237a0 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79  with heap memory
237b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
237c0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
237d0 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70  mory(unixFile *p
237e0 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
237f0 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20  unixShm *p = 0; 
23800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23810 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
23820 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
23830 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
23840 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20  *pShmNode;   /* 
23850 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
23860 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
23870 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
238a0 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
238b0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
238c0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64       /* The inod
238d0 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61  e of fd */.  cha
238e0 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  r *zShmFilename;
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23900 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
23910 20 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f   used for SHM */
23920 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e  .  int nShmFilen
23930 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
23940 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
23950 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69  e SHM filename i
23960 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
23970 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
23980 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
23990 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  Shm object. */. 
239a0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
239b0 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
239c0 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
239d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
239e0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
239f0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
23a00 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74  f(*p));.  assert
23a10 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
23a20 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
23a30 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78  to see if a unix
23a40 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61  ShmNode object a
23a50 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52  lready exists. R
23a60 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
23a70 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65  .  ** one if pre
23a80 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e  sent. Create a n
23a90 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
23aa0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  ary..  */.  unix
23ab0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
23ac0 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
23ad0 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f  pInode;.  pShmNo
23ae0 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68  de = pInode->pSh
23af0 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68  mNode;.  if( pSh
23b00 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
23b10 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
23b20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23b30 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e     /* fstat() in
23b40 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  fo for database 
23b50 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
23b60 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
23b70 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63  TORY.    const c
23b80 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d  har *zBasePath =
23b90 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23   pDbFd->zPath;.#
23ba0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61  endif..    /* Ca
23bb0 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
23bc0 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
23bd0 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
23be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
23bf0 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
23c00 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
23c10 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
23c20 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
23c30 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
23c40 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
23c50 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
23c60 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
23c70 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
23c80 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72  Stat) ){.      r
23c90 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
23ca0 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f  _FSTAT;.      go
23cb0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
23cc0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
23cd0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23ce0 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65  ORY.    nShmFile
23cf0 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51  name = sizeof(SQ
23d00 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23d10 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a  RY) + 31;.#else.
23d20 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
23d30 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c   = 6 + (int)strl
23d40 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23  en(zBasePath);.#
23d50 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
23d60 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
23d70 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
23d80 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46  ShmNode) + nShmF
23d90 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69  ilename );.    i
23da0 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
23db0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
23dc0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
23dd0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
23de0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
23df0 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
23e00 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
23e10 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
23e20 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
23e30 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
23e40 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
23e50 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
23e60 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
23e70 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
23e80 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
23e90 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
23ea0 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
23eb0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
23ec0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23ed0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
23ee0 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
23ef0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23f00 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
23f10 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
23f20 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
23f30 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
23f40 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
23f50 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
23f60 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
23f70 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20  zBasePath);.    
23f80 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
23f90 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
23fa0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
23fb0 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
23fc0 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
23fd0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
23fe0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
23ff0 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
24000 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
24010 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69  d->pInode;.    i
24020 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
24030 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
24040 78 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e  x ){.      pShmN
24050 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
24060 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
24070 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
24080 53 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ST);.      if( p
24090 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
240a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
240b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
240c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
240d0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
240e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
240f0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
24100 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
24110 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e  {.      int open
24120 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
24130 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20   O_CREAT;.      
24140 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
24150 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a  boolean(pDbFd->z
24160 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f  Path, "readonly_
24170 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  shm", 0) ){.    
24180 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
24190 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
241a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
241b0 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
241c0 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f    }.      pShmNo
241d0 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f  de->h = robust_o
241e0 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  pen(zShmFilename
241f0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53  , openFlags, (sS
24200 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  tat.st_mode&0777
24210 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ));.      if( pS
24220 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20  hmNode->h<0 ){. 
24230 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
24240 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24250 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
24260 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e  open", zShmFilen
24270 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
24280 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
24290 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
242a0 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
242b0 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
242c0 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65   root, make sure
242d0 20 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69   that the SHM fi
242e0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f  le.      ** is o
242f0 77 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  wned by the same
24300 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20   user that owns 
24310 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
24320 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73  abase.  Otherwis
24330 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
24340 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77  original owner w
24350 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
24360 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20  to connect..    
24370 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
24380 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65  tFchown(pShmNode
24390 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69  ->h, sStat.st_ui
243a0 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29  d, sStat.st_gid)
243b0 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68  ;.  .      /* Ch
243c0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
243d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
243e0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
243f0 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
24400 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
24410 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
24420 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
24430 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
24440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24450 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53  .      if( unixS
24460 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
24470 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49  Fd, F_WRLCK, UNI
24480 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  X_SHM_DMS, 1)==S
24490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
244a0 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
244b0 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
244c0 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20  e->h, 0) ){.    
244d0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
244e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
244f0 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66  OERR_SHMOPEN, "f
24500 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46  truncate", zShmF
24510 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
24520 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
24550 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
24560 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
24570 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
24580 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  MS, 1);.      }.
24590 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
245a0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
245b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
245c0 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
245d0 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
245e0 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
245f0 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
24600 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
24610 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
24620 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
24630 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
24640 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
24650 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
24660 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
24670 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
24680 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
24690 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
246a0 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
246b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
246c0 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
246d0 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
246e0 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
246f0 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
24700 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
24710 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
24720 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
24730 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
24740 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
24750 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
24760 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
24770 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
24780 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
24790 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
247a0 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
247b0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
247c0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
247d0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
247e0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
247f0 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
24800 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
24810 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
24820 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
24830 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
24840 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
24850 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
24860 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
24870 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
24880 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
24890 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
248a0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
248b0 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
248c0 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
248d0 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
248e0 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
248f0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
24900 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
24910 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
24920 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
24930 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
24940 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24950 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24960 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24970 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
24980 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
24990 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
249a0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
249b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
249c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
249d0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
249e0 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
249f0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
24a00 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
24a10 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
24a20 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
24a30 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
24a40 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
24a50 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24a60 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
24a70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
24a80 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
24a90 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
24aa0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
24ab0 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
24ac0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
24ad0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
24ae0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
24af0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
24b00 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
24b10 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
24b20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
24b30 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
24b40 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
24b50 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
24b60 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
24b70 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
24b80 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
24b90 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
24ba0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
24bb0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
24bc0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
24bd0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
24be0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
24bf0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
24c00 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
24c10 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
24c20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
24c30 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
24c40 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
24c50 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
24c60 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
24c70 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
24c80 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
24c90 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
24ca0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
24cb0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
24cc0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
24cd0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
24ce0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
24cf0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24d00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
24d10 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
24d20 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d40 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
24d50 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24d60 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
24d90 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
24da0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24dc0 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
24dd0 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
24de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24df0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
24e00 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
24e10 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
24e20 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24e40 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
24e50 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
24e60 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
24e70 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
24e80 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
24e90 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
24ea0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
24eb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
24ec0 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69  nShmPerMap = uni
24ed0 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
24ee0 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65  ();.  int nReqRe
24ef0 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  gion;..  /* If t
24f00 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
24f10 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
24f20 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
24f30 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
24f40 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
24f50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
24f60 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
24f70 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
24f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24f90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
24fa0 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
24fb0 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
24fc0 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
24fd0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
24fe0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
24ff0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
25000 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
25010 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
25020 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
25030 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
25040 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
25050 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
25060 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
25070 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
25080 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
25090 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
250a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
250b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
250c0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
250d0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
250e0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75   );..  /* Minimu
250f0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  m number of regi
25100 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ons required to 
25110 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20  be mapped. */.  
25120 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69  nReqRegion = ((i
25130 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61  Region+nShmPerMa
25140 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29  p) / nShmPerMap)
25150 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a   * nShmPerMap;..
25160 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
25170 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
25180 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  on ){.    char *
25190 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
251b0 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61  New apRegion[] a
251c0 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
251d0 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69  nByte = nReqRegi
251e0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f  on*szRegion;   /
251f0 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72  * Minimum requir
25200 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
25210 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
25220 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
25230 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
25240 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20  y fstat() */..  
25250 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
25260 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
25270 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ..    if( pShmNo
25280 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
25290 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
252a0 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
252b0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
252c0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
252d0 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20  ess space..     
252e0 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
252f0 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
25300 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
25310 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
25320 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a   file is.      *
25330 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
25340 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
25350 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
25360 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25370 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d  if( osFstat(pShm
25380 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  Node->h, &sStat)
25390 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
253a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
253b0 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67  MSIZE;.        g
253c0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
253d0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
253e0 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73    if( sStat.st_s
253f0 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20  ize<nByte ){.   
25400 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
25410 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
25420 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
25430 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69  st. If bExtend i
25440 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20  s set to.       
25450 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20   ** false, exit 
25460 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
25470 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
25480 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
25490 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  urned..        *
254a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62  /.        if( !b
254b0 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  Extend ){.      
254c0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
254d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
254e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  .        /* Alte
254f0 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45  rnatively, if bE
25500 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65  xtend is true, e
25510 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
25520 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  Do this by.     
25530 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20     ** writing a 
25540 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74  single byte to t
25550 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28  he end of each (
25560 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20  OS) page being. 
25570 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
25580 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e  ted or extended.
25590 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
255a0 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65   need only write
255b0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
255c0 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  ** last page in 
255d0 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20  order to extend 
255e0 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72  the file. But wr
255f0 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77  iting to all new
25600 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
25610 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20  s forces the OS 
25620 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  to allocate them
25630 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68   immediately, wh
25640 69 63 68 20 72 65 64 75 63 65 73 0a 20 20 20 20  ich reduces.    
25650 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63      ** the chanc
25660 65 73 20 6f 66 20 53 49 47 42 55 53 20 77 68 69  es of SIGBUS whi
25670 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  le accessing the
25680 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c   mapped region l
25690 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20  ater on..       
256a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65   */.        else
256b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
256c0 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73  ic const int pgs
256d0 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20  z = 4096;.      
256e0 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20      int iPg;..  
256f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
25700 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
25710 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20  e of each newly 
25720 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
25730 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  ended page */.  
25740 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25750 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d  (nByte % pgsz)==
25760 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  0 );.          f
25770 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74  or(iPg=(sStat.st
25780 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67  _size/pgsz); iPg
25790 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69  <(nByte/pgsz); i
257a0 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
257b0 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20     int x = 0;.  
257c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 65            if( se
257d0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70 53 68  ekAndWriteFd(pSh
257e0 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67  mNode->h, iPg*pg
257f0 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c  sz + pgsz-1, "",
25800 20 31 2c 20 26 78 29 21 3d 31 20 29 7b 0a 20 20   1, &x)!=1 ){.  
25810 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
25820 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
25830 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
25840 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
25850 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
25860 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
25870 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74  R_SHMSIZE, "writ
25880 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  e", zFile);.    
25890 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
258a0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
258b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
258c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
258d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
258e0 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
258f0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
25900 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
25910 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
25920 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
25930 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a  apNew = (char **
25940 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
25950 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
25960 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52  de->apRegion, nR
25970 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28  eqRegion*sizeof(
25980 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20  char *).    );. 
25990 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
259a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
259b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
259c0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
259d0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
259e0 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
259f0 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  >apRegion = apNe
25a00 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  w;.    while( pS
25a10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
25a20 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20  nReqRegion ){.  
25a30 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73      int nMap = s
25a40 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d  zRegion*nShmPerM
25a50 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  ap;.      int i;
25a60 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
25a70 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
25a80 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
25a90 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73         pMem = os
25aa0 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20  Mmap(0, nMap,.  
25ab0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
25ac0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
25ad0 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
25ae0 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
25af0 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
25b00 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
25b10 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f  Node->h, szRegio
25b20 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d  n*(i64)pShmNode-
25b30 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20  >nRegion.       
25b40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
25b50 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pMem==MAP_FAILED
25b60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25b70 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
25b80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
25b90 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68  MAP, "mmap", pSh
25ba0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
25bb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
25bc0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
25bf0 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  em = sqlite3_mal
25c00 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b  loc64(szRegion);
25c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
25c20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
25c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
25c40 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
25c50 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
25c60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
25c70 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
25c80 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
25c90 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
25ca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68    for(i=0; i<nSh
25cb0 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20  mPerMap; i++){. 
25cc0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
25cd0 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
25ce0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d  de->nRegion+i] =
25cf0 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b   &((char*)pMem)[
25d00 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20  szRegion*i];.   
25d10 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e     }.      pShmN
25d20 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20  ode->nRegion += 
25d30 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
25d40 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
25d50 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
25d60 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
25d70 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d  ion ){.    *pp =
25d80 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
25d90 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  ion[iRegion];.  
25da0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
25db0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   0;.  }.  if( pS
25dc0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
25dd0 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ly && rc==SQLITE
25de0 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54  _OK ) rc = SQLIT
25df0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71  E_READONLY;.  sq
25e00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25e10 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
25e20 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
25e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
25e40 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
25e50 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
25e60 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a  ory segment..**.
25e70 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
25e80 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
25e90 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64  tween SHAREd and
25ea0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
25eb0 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20   is a little.** 
25ec0 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20 74  different here t
25ed0 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49  han in posix.  I
25ee0 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e  n xShmLock(), on
25ef0 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e  e can go from un
25f00 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61  locked.** to sha
25f10 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20  red and back or 
25f20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
25f30 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62   exclusive and b
25f40 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61  ack.  But one ma
25f50 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d  y.** not go from
25f60 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75   shared to exclu
25f70 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63  sive or from exc
25f80 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65 64  lusive to shared
25f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25fa0 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  unixShmLock(.  s
25fb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
25fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
25fd0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
25fe0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
25ff0 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
26000 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
26010 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
26020 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
26030 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
26040 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
26050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26060 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
26070 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
26080 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
260b0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
260c0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
260d0 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
260e0 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43  e*)fd;      /* C
260f0 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
26100 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
26110 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20  */.  unixShm *p 
26120 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
26130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26140 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
26150 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
26160 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20    unixShm *pX;  
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
26190 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
261a0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e  siblings */.  un
261b0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
261c0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
261d0 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  e;  /* The under
261e0 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65  lying file iNode
261f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
26200 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
26210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26220 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
26230 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
26260 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
26270 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
26280 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
26290 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  ==pDbFd->pInode-
262a0 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61  >pShmNode );.  a
262b0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
262c0 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  >pInode==pDbFd->
262d0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  pInode );.  asse
262e0 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
262f0 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
26300 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
26310 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
26320 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
26330 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
26340 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
26350 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
26360 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
26370 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
26380 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
26390 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
263a0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
263b0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
263c0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
263d0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
263e0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
263f0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
26400 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
26410 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
26420 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
26430 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61  USIVE)!=0 );.  a
26440 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
26450 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
26460 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
26470 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
26480 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
26490 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
264a0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
264b0 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  k==0 );..  mask 
264c0 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
264d0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61  - (1<<ofst);.  a
264e0 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
264f0 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
26500 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
26510 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
26520 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
26530 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
26540 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
26550 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
26560 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
26570 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
26580 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
26590 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
265a0 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
265b0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
265c0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
265d0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
265e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
265f0 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
26600 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
26610 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
26620 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
26630 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
26640 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
26650 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
26660 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
26670 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
26680 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
26690 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
266a0 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
266b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
266c0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
266d0 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b  k(pDbFd, F_UNLCK
266e0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
266f0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  BASE, n);.    }e
26700 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
26710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
26720 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68  ..    /* Undo th
26730 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f  e local locks */
26740 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26760 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  p->exclMask &= ~
26770 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73  mask;.      p->s
26780 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
26790 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c  sk;.    } .  }el
267a0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
267b0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
267c0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53   ){.    u16 allS
267d0 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55  hared = 0;  /* U
267e0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
267f0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
26800 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
26810 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   */..    /* Find
26820 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65   out which share
26830 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65  d locks are alre
26840 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c  ady held by sibl
26850 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ing connections.
26860 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  .    ** If any s
26870 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
26880 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
26890 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
268a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
268b0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  ** SQLITE_BUSY..
268c0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
268d0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
268e0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
268f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
26900 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
26910 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
26920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26930 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
26940 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26950 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
26960 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
26970 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
26980 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
26990 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
269a0 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
269b0 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  y */.    if( rc=
269c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
269d0 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72      if( (allShar
269e0 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  ed & mask)==0 ){
269f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
26a00 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
26a10 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20  pDbFd, F_RDLCK, 
26a20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
26a30 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
26a40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
26a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26a60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
26a70 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
26a80 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
26a90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26ab0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
26ac0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
26ad0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
26ae0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
26af0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
26b00 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
26b10 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
26b20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
26b30 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
26b40 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
26b50 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
26b60 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
26b70 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
26b80 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
26b90 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
26ba0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
26bb0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
26bc0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
26bd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26be0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
26bf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26c00 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
26c10 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
26c20 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
26c30 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
26c40 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
26c50 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
26c60 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
26c70 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
26c80 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
26c90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26cb0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
26cc0 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
26cd0 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  WRLCK, ofst+UNIX
26ce0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
26cf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26d10 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
26d20 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
26d30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
26d40 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
26d50 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
26d60 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
26d70 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
26d80 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
26d90 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
26da0 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
26db0 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
26dc0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
26dd0 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64   p->id, osGetpid
26de0 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  (0), p->sharedMa
26df0 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
26e00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26e10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
26e20 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
26e30 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
26e40 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
26e50 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
26e60 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
26e70 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
26e80 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
26e90 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
26ea0 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
26eb0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
26ec0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
26ed0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
26ee0 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
26ef0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
26f20 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
26f30 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
26f40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
26f50 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74  TER(fd);.  sqlit
26f60 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  e3MemoryBarrier(
26f70 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f  );         /* co
26f80 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d  mpiler-defined m
26f90 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f  emory barrier */
26fa0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
26fb0 78 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  x();            
26fc0 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78     /* Also mutex
26fd0 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79  , for redundancy
26fe0 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   */.  unixLeaveM
26ff0 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
27000 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
27010 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
27020 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
27030 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
27040 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
27050 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
27060 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
27070 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f  s no shared memo
27080 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
27090 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  th the connectio
270a0 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  n then this.** r
270b0 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
270c0 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  less no-op..*/.s
270d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
270e0 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  mUnmap(.  sqlite
270f0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
27100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27110 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
27120 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
27130 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27150 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d  * Delete shared-
27160 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a  memory if true *
27170 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  /.){.  unixShm *
27180 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
27190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
271a0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
271b0 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  losed */.  unixS
271c0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
271d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
271e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
271f0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
27200 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70  */.  unixShm **p
27210 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
27220 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
27230 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
27240 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
27250 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
27260 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
27270 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
27280 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
27290 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  e */..  pDbFd = 
272a0 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20  (unixFile*)fd;. 
272b0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
272c0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
272d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
272e0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
272f0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73  >pShmNode;..  as
27300 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
27310 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
27320 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
27330 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
27340 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
27350 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  node );..  /* Re
27360 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
27370 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
27380 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
27390 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
273a0 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
273b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
273c0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
273d0 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
273e0 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
273f0 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
27400 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
27410 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
27420 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
27430 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
27440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
27450 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
27460 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
27470 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
27480 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
27490 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
274a0 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
274b0 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
274c0 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
274d0 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
274e0 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
274f0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
27500 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
27510 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
27520 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
27530 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
27540 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
27550 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65   ){.    if( dele
27560 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f  teFlag && pShmNo
27570 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
27580 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e    osUnlink(pShmN
27590 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
275a0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53  .    }.    unixS
275b0 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
275c0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
275d0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
275e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
275f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
27600 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
27610 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
27620 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
27630 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
27640 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
27650 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
27660 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
27670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
27680 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
27690 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
276a0 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63  /*.** If it is c
276b0 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20  urrently memory 
276c0 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69  mapped, unmap fi
276d0 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69  le pFd..*/.stati
276e0 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70  c void unixUnmap
276f0 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
27700 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Fd){.  assert( p
27710 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
27720 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
27730 45 5f 53 48 41 52 45 44 5f 4d 41 50 50 49 4e 47  E_SHARED_MAPPING
27740 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 49 6e 6f  .  if( pFd->pIno
27750 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e  de ) return;.#en
27760 64 69 66 0a 20 20 69 66 28 20 70 46 64 2d 3e 70  dif.  if( pFd->p
27770 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
27780 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70   osMunmap(pFd->p
27790 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e  MapRegion, pFd->
277a0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b  mmapSizeActual);
277b0 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65  .    pFd->pMapRe
277c0 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46  gion = 0;.    pF
277d0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  d->mmapSize = 0;
277e0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
277f0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
27800 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
27810 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 73 69  pt to set the si
27820 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ze of the memory
27830 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69   mapping maintai
27840 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20  ned by file .** 
27850 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 74  descriptor pFd t
27860 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e  o nNew bytes. An
27870 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
27880 6e 67 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  ng is discarded.
27890 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
278a0 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74  sful, this funct
278b0 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c  ion sets the fol
278c0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
278d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e  :.**.**       un
278e0 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f  ixFile.pMapRegio
278f0 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  n.**       unixF
27900 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20  ile.mmapSize.** 
27910 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
27920 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a  mapSizeActual.**
27930 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73  .** If unsuccess
27940 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ful, an error me
27950 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20  ssage is logged 
27960 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  via sqlite3_log(
27970 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72  ) and.** the thr
27980 65 65 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f  ee variables abo
27990 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49  ve are zeroed. I
279a0 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c 69  n this case SQLi
279b0 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e  te should.** con
279c0 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20  tinue accessing 
279d0 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
279e0 6e 67 20 74 68 65 20 78 52 65 61 64 28 29 20 61  ng the xRead() a
279f0 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d  nd xWrite().** m
27a00 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
27a10 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70  c void unixRemap
27a20 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65  file(.  unixFile
27a30 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20 20   *pFd,          
27a40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
27a50 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63  descriptor objec
27a60 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20  t */.  i64 nNew 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
27a90 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ed mapping size 
27aa0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
27ab0 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70  ar *zErr = "mmap
27ac0 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64  ";.  int h = pFd
27ad0 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ->h;            
27ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
27af0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
27b00 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  n on db file */.
27b10 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75    u8 *pOrig = (u
27b20 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
27b30 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ion;   /* Pointe
27b40 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c  r to current fil
27b50 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69  e mapping */.  i
27b60 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e  64 nOrig = pFd->
27b70 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
27b80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
27b90 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62  Orig region in b
27ba0 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e  ytes */.  u8 *pN
27bb0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27bd0 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65  * Location of ne
27be0 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69  w mapping */.  i
27bf0 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f  nt flags = PROT_
27c00 52 45 41 44 3b 20 20 20 20 20 20 20 20 20 20 20  READ;           
27c10 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
27c20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a  pass to mmap() *
27c30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  /..  assert( pFd
27c40 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
27c50 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
27c60 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  >pFd->mmapSize )
27c70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
27c80 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  <=pFd->mmapSizeM
27c90 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ax );.  assert( 
27ca0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65  nNew>0 );.  asse
27cb0 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  rt( pFd->mmapSiz
27cc0 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d  eActual>=pFd->mm
27cd0 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  apSize );.  asse
27ce0 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d  rt( MAP_FAILED!=
27cf0 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
27d00 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49  ITE_MMAP_READWRI
27d10 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63  TE.  if( (pFd->c
27d20 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
27d30 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
27d40 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57   flags |= PROT_W
27d50 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  RITE;.#endif..  
27d60 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66  if( pOrig ){.#if
27d70 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20   HAVE_MREMAP.   
27d80 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46   i64 nReuse = pF
27d90 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c  d->mmapSize;.#el
27da0 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
27db0 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47   szSyspage = osG
27dc0 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20  etpagesize();.  
27dd0 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28    i64 nReuse = (
27de0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20  pFd->mmapSize & 
27df0 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b  ~(szSyspage-1));
27e00 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
27e10 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52  pReq = &pOrig[nR
27e20 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55  euse];..    /* U
27e30 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f  nmap any pages o
27e40 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  f the existing m
27e50 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e  apping that cann
27e60 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f  ot be reused. */
27e70 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21  .    if( nReuse!
27e80 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  =nOrig ){.      
27e90 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e  osMunmap(pReq, n
27ea0 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20  Orig-nReuse);.  
27eb0 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52    }..#if HAVE_MR
27ec0 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20  EMAP.    pNew = 
27ed0 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20  osMremap(pOrig, 
27ee0 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52  nReuse, nNew, MR
27ef0 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20  EMAP_MAYMOVE);. 
27f00 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61     zErr = "mrema
27f10 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p";.#else.    pN
27f20 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71  ew = osMmap(pReq
27f30 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66  , nNew-nReuse, f
27f40 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44  lags, MAP_SHARED
27f50 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  , h, nReuse);.  
27f60 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f    if( pNew!=MAP_
27f70 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
27f80 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29  if( pNew!=pReq )
27f90 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
27fa0 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20  ap(pNew, nNew - 
27fb0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20  nReuse);.       
27fc0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20   pNew = 0;.     
27fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27fe0 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20  pNew = pOrig;.  
27ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
28000 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  if..    /* The a
28010 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64  ttempt to extend
28020 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
28030 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72  pping failed. Fr
28040 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ee it. */.    if
28050 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
28060 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b  ED || pNew==0 ){
28070 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
28080 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a  pOrig, nReuse);.
28090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
280a0 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c  If pNew is still
280b0 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72   NULL, try to cr
280c0 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79  eate an entirely
280d0 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f   new mapping. */
280e0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
280f0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  {.    pNew = osM
28100 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61  map(0, nNew, fla
28110 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
28120 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  h, 0);.  }..  if
28130 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
28140 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ED ){.    pNew =
28150 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30   0;.    nNew = 0
28160 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  ;.    unixLogErr
28170 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45  or(SQLITE_OK, zE
28180 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  rr, pFd->zPath);
28190 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
281a0 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69  mmap() above fai
281b0 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  led, assume that
281c0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
281d0 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20  mmap() calls.   
281e0 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c   ** will probabl
281f0 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c  y fail too. Fall
28200 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78   back to using x
28210 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c  Read/xWrite excl
28220 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69  usively.    ** i
28230 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
28240 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
28250 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  zeMax = 0;.  }. 
28260 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
28270 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b   = (void *)pNew;
28280 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  .  pFd->mmapSize
28290 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
282a0 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d  Actual = nNew;.}
282b0 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
282c0 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
282d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
282e0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
282f0 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
28300 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
28310 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
28320 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
28330 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
28340 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
28350 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
28360 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
28370 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
28380 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
28390 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
283a0 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
283b0 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
283c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
283d0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
283e0 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
283f0 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
28400 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
28410 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
28420 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
28430 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
28440 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
28450 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
28460 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
28470 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
28480 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
28490 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
284a0 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
284b0 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
284c0 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
284d0 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
284e0 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
284f0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
28500 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
28510 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FCNTL_MMAP_LIMIT
28520 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
28530 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
28540 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28550 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
28560 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
28570 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
28580 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
28590 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
285a0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
285b0 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
285c0 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
285d0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
285e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
285f0 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
28600 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61 70 29 7b  *pFd, i64 nMap){
28610 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
28620 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
28630 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
28640 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28  ert( nMap>0 || (
28650 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30  pFd->mmapSize==0
28660 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67   && pFd->pMapReg
28670 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ion==0) );.  if(
28680 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
28690 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
286a0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  E_OK;..  if( nMa
286b0 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  p<0 ){.    struc
286c0 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
286d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d           /* Low-
286e0 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72  level file infor
286f0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  mation */.    if
28700 28 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68  ( osFstat(pFd->h
28710 2c 20 26 73 74 61 74 62 75 66 29 20 29 7b 0a 20  , &statbuf) ){. 
28720 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28730 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
28740 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d      }.    nMap =
28750 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
28760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
28770 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  >pFd->mmapSizeMa
28780 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  x ){.    nMap = 
28790 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
287a0 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
287b0 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d 41 50 50  LITE_SHARED_MAPP
287c0 49 4e 47 0a 20 20 69 66 28 20 70 46 64 2d 3e 70  ING.  if( pFd->p
287d0 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75 6e 69  Inode ){.    uni
287e0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
287f0 64 65 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  de = pFd->pInode
28800 3b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70  ;.    if( pFd->p
28810 4d 61 70 52 65 67 69 6f 6e 20 29 20 72 65 74 75  MapRegion ) retu
28820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28830 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
28840 28 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  ();.    if( pIno
28850 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70 69  de->pSharedMappi
28860 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  ng==0 ){.      u
28870 38 20 2a 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70  8 *pNew = osMmap
28880 28 30 2c 20 6e 4d 61 70 2c 20 50 52 4f 54 5f 52  (0, nMap, PROT_R
28890 45 41 44 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  EAD, MAP_SHARED,
288a0 20 70 46 64 2d 3e 68 2c 20 30 29 3b 0a 20 20 20   pFd->h, 0);.   
288b0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
288c0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
288d0 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28     unixLogError(
288e0 53 51 4c 49 54 45 5f 4f 4b 2c 20 22 6d 6d 61 70  SQLITE_OK, "mmap
288f0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
28900 20 20 20 20 20 20 20 20 70 46 64 2d 3e 6d 6d 61          pFd->mma
28910 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20  pSizeMax = 0;.  
28920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28930 20 20 20 70 49 6e 6f 64 65 2d 3e 70 53 68 61 72     pInode->pShar
28940 65 64 4d 61 70 70 69 6e 67 20 3d 20 70 4e 65 77  edMapping = pNew
28950 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
28960 2d 3e 6e 53 68 61 72 65 64 4d 61 70 70 69 6e 67  ->nSharedMapping
28970 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 7d   = nMap;.      }
28980 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
28990 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 49 6e  pMapRegion = pIn
289a0 6f 64 65 2d 3e 70 53 68 61 72 65 64 4d 61 70 70  ode->pSharedMapp
289b0 69 6e 67 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  ing;.    pFd->mm
289c0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 70  apSizeActual = p
289d0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
289e0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 4d 61  Inode->nSharedMa
289f0 70 70 69 6e 67 3b 0a 20 20 20 20 75 6e 69 78 4c  pping;.    unixL
28a00 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
28a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28a20 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  K;.  }.#endif.. 
28a30 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20   assert( nMap>0 
28a40 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  || (pFd->mmapSiz
28a50 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61  e==0 && pFd->pMa
28a60 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20  pRegion==0) );. 
28a70 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
28a80 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
28a90 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46  unixRemapfile(pF
28aa0 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20  d, nMap);.  }.. 
28ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28ac0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
28ad0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
28ae0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
28af0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
28b00 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28b10 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
28b20 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
28b30 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
28b40 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
28b50 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
28b60 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
28b70 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
28b80 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
28b90 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
28ba0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
28bb0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
28bc0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
28bd0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
28be0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
28bf0 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
28c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
28c10 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
28c20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
28c30 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
28c40 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
28c50 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
28c60 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
28c70 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
28c80 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
28c90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
28ca0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
28cb0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
28cc0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
28cd0 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
28ce0 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
28cf0 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
28d00 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
28d10 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
28d20 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
28d30 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
28d40 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
28d50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
28d60 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
28d70 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
28d80 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
28d90 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
28da0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28db0 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
28dc0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
28dd0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
28de0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
28df0 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
28e00 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
28e10 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
28e20 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
28e30 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
28e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28e50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28e70 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
28e80 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
28e90 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
28ea0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
28eb0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
28ec0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
28ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
28ee0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
28ef0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28f00 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
28f10 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
28f20 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
28f30 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
28f40 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
28f50 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
28f60 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e  rlier call to un
28f70 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  ixFetch(). The s
28f80 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
28f90 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
28fa0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
28fb0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
28fc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
28fd0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
28fe0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
28ff0 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69  he unixFetch() i
29000 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
29010 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
29020 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
29030 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
29040 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
29050 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
29060 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
29070 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
29080 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
29090 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
290a0 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
290b0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
290c0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
290d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
290e0 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69  unixUnfetch(sqli
290f0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
29100 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
29110 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
29120 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
29130 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
29140 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
29150 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
29160 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
29170 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
29180 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20  AMETER(iOff);.. 
29190 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
291a0 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
291b0 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
291c0 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
291d0 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
291e0 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
291f0 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
29200 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
29210 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
29220 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
29230 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
29240 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
29250 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29260 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
29270 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
29280 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
29290 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
292a0 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
292b0 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
292c0 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
292d0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
292e0 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
292f0 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
29300 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
29310 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  .    unixUnmapfi
29320 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
29330 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
29340 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c  tchOut>=0 );.#el
29350 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
29360 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
29370 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
29380 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29390 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64  ETER(iOff);.#end
293a0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
293b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
293c0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
293d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
293e0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
293f0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
29400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29410 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
29420 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
29430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
29450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
294a0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
294b0 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
294c0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
294d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
294e0 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
294f0 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
29500 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
29510 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
29520 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
29530 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
29540 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
29550 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
29560 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
29570 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
29580 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
29590 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
295a0 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
295b0 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
295c0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
295d0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
295e0 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
295f0 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
29600 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
29610 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
29620 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
29630 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
29640 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
29650 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
29660 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
29670 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
29680 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29690 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
296a0 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
296b0 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
296c0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
296d0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
296e0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
296f0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
29700 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
29710 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
29720 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
29730 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
29740 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  or finder-functi
29750 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
29760 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
29770 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
29780 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
29790 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
297a0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
297b0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
297c0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
297d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
297e0 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
297f0 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
29800 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
29810 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
29820 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
29830 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
29840 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
29850 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
29860 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
29870 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
29880 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
29890 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
298a0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
298b0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
298c0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
298d0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
298e0 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
298f0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
29900 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
29910 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
29920 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
29930 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29940 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
29950 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
29960 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
29970 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
29980 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
29990 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
299a0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
299b0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
299c0 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
299d0 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
299e0 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
299f0 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
29a00 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
29a10 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
29a20 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
29a30 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45  FINDER,METHOD,VE
29a40 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b  RSION,CLOSE,LOCK
29a50 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53  ,UNLOCK,CKLOCK,S
29a60 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61  HMMAP)     \.sta
29a70 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
29a80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
29a90 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
29ac0 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
29ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
29ae0 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b00 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
29b10 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
29b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29b30 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
29b60 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
29b70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
29b80 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ba0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
29bb0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
29bc0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
29bd0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
29c00 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
29c10 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
29c20 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
29c50 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
29c60 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
29c70 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c90 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
29ca0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
29cb0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
29cc0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
29d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29da0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29db0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
29de0 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
29df0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
29e00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29e20 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
29e30 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
29e40 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
29e50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29e70 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
29e80 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
29e90 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
29ea0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29ec0 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20    SHMMAP,       
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ee0 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29f10 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f30 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29f60 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
29f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29f80 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29fb0 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  nixShmUnmap,    
29fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29fd0 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2a000 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  ixFetch,        
2a010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
2a020 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2a050 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20  xUnfetch,       
2a060 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
2a070 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 20 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 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
2a0f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a100 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
2a110 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
2a120 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
2a130 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
2a140 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
2a150 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2a160 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
2a190 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1d0 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a220 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
2a230 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a240 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
2a250 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
2a260 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
2a270 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
2a280 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
2a290 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
2a2a0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2a2b0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
2a2c0 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
2a2d0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
2a2e0 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
2a2f0 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
2a300 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
2a310 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
2a320 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
2a330 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
2a340 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2a350 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2a360 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2a370 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
2a380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
2a390 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a3a0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2a3b0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2a3d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64  hared memory and
2a3e0 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65   mmap are enable
2a3f0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
2a400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a410 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a420 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a450 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
2a460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a470 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a480 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
2a490 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2a4a0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a4b0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a4c0 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  .  unixShmMap   
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4e0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a4f0 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
2a500 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
2a510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a520 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2a530 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
2a540 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2a550 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2a560 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2a570 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
2a5a0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
2a5b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
2a5c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a5d0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
2a5e0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a600 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
2a610 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
2a620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2a630 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a640 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
2a650 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f  ReservedLock,  /
2a660 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
2a670 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2a680 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2a690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2a6a0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2a6b0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
2a6c0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
2a6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2a6e0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2a6f0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
2a700 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a710 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2a720 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2a730 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2a760 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2a770 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a790 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2a7a0 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a7c0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2a7d0 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a7f0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2a800 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
2a810 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20  eservedLock, /* 
2a820 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2a830 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2a860 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2a870 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2a880 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a890 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
2a8a0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2a8b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2a8c0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2a8d0 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
2a8e0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2a8f0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2a900 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2a910 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a940 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2a950 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
2a960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a970 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2a980 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
2a990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a9a0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2a9b0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
2a9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2a9d0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2a9e0 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
2a9f0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
2aa00 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2aa10 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa30 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2aa40 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2aa50 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
2aa60 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
2aa70 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aa90 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2aaa0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
2aab0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2aac0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2aad0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2aae0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab00 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2ab10 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2ab20 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65  d */.  semXClose
2ab30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ab40 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2ab50 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c  d */.  semXLock,
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2ab80 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b   */.  semXUnlock
2ab90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2aba0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2abb0 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b  d */.  semXCheck
2abc0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
2abd0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2abe0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2abf0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ac10 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2ac20 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2ac30 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2ac40 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2ac50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2ac60 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
2ac70 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
2ac80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2ac90 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2aca0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
2acb0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
2acc0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2acd0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2ace0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2ad10 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2ad20 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad40 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2ad50 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad70 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2ad80 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ada0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2adb0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
2adc0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
2add0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2ade0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2ae10 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2ae20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2ae30 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
2ae40 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
2ae50 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
2ae60 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
2ae70 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
2ae80 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
2ae90 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
2aea0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
2aeb0 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
2aec0 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
2aed0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
2aee0 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
2aef0 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
2af00 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
2af10 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2af20 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
2af30 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
2af40 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
2af50 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
2af60 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
2af70 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
2af80 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
2af90 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
2afa0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
2afb0 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
2afc0 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
2afd0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
2afe0 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
2aff0 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
2b000 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
2b010 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2b020 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2b030 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b040 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
2b050 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
2b060 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
2b070 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
2b080 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2b090 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
2b0a0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
2b0b0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2b0c0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2b0d0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
2b0e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2b0f0 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
2b100 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
2b110 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2b120 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2b130 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
2b140 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
2b150 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2b160 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2b170 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
2b180 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
2b190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
2b1a0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
2b1b0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
2b1c0 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
2b1d0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2b1e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
2b1f0 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
2b200 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2b210 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2b220 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2b230 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2b240 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
2b250 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
2b260 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
2b270 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
2b280 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2b2b0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2b2c0 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
2b2d0 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
2b2e0 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
2b2f0 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
2b300 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
2b310 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2b320 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2b330 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2b340 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
2b350 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b370 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2b380 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
2b390 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
2b3a0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2b3b0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b3c0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2b3f0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
2b400 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
2b410 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2b420 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2b430 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
2b440 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2b450 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
2b460 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
2b470 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2b480 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2b490 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2b4a0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2b4b0 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
2b4c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2b4d0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2b500 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2b510 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
2b520 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2b530 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b540 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
2b550 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2b560 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
2b570 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2b580 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
2b590 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
2b5a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b5b0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
2b5c0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
2b5d0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2b5e0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2b5f0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2b600 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2b610 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2b620 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
2b630 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2b640 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2b650 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
2b660 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2b670 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2b680 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2b690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b6a0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2b6b0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2b6c0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
2b6d0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
2b6e0 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
2b6f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2b700 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
2b710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2b720 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
2b730 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
2b740 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
2b750 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
2b760 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2b770 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
2b780 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
2b790 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
2b7a0 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
2b7b0 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
2b7c0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2b7d0 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
2b7e0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
2b7f0 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
2b800 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2b810 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
2b820 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2b830 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
2b840 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
2b850 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
2b860 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
2b870 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2b880 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
2b890 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2b8a0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2b8b0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2b8c0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2b8d0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2b8e0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2b8f0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2b900 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2b910 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2b920 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2b930 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2b940 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
2b950 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
2b960 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
2b970 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
2b980 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
2b990 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
2b9a0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2b9b0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
2b9c0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
2b9d0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2b9e0 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
2b9f0 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2ba00 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2ba10 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2ba20 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
2ba30 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
2ba40 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
2ba50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2ba60 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
2ba70 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
2ba80 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
2ba90 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
2baa0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
2bab0 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
2bac0 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
2bad0 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
2bae0 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
2baf0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
2bb00 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
2bb10 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2bb20 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2bb30 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2bb40 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2bb50 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2bb60 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2bb70 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2bb80 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2bb90 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2bba0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2bbb0 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ) {.    if( strc
2bbc0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
2bbd0 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d  pename, "nfs")==
2bbe0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2bbf0 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b  n &nfsIoMethods;
2bc00 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2bc10 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2bc20 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  xIoMethods;.    
2bc30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
2bc40 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
2bc50 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2bc60 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2bc70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2bc80 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
2bc90 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
2bca0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2bcb0 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
2bcc0 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
2bcd0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
2bce0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2bcf0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2bd00 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
2bd10 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a   OS_VXWORKS./*.*
2bd20 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2bd30 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57  function for VxW
2bd40 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73  orks checks to s
2bd50 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69  ee if posix advi
2bd60 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20  sory.** locking 
2bd70 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f  works.  If it do
2bd80 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  es, then that is
2bd90 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   what is used.  
2bda0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
2bdb0 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c  * work, then fal
2bdc0 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73  lback to named s
2bdd0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2bde0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2bdf0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2be00 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46  hods *vxworksIoF
2be10 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2be20 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2be30 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2be40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2be50 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2be60 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2be70 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
2be80 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
2be90 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2bea0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2beb0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2bec0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2bed0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2bee0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2bef0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2bf00 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2bf10 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2bf20 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2bf30 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2bf40 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2bf50 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
2bf60 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
2bf70 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
2bf80 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
2bf90 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
2bfa0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
2bfb0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
2bfc0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
2bfd0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2bfe0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2bff0 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2c000 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2c010 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2c020 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2c030 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2c040 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2c050 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2c060 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
2c070 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2c080 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2c090 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
2c0a0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2c0b0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2c0c0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2c0d0 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72    *(*const vxwor
2c0e0 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ksIoFinder)(cons
2c0f0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2c100 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69  *) = vxworksIoFi
2c110 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2c120 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2c130 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
2c140 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
2c150 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49   pointer to an I
2c160 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
2c170 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
2c180 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
2c190 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
2c1a0 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
2c1b0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2c1c0 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
2c1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c210 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2c220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c230 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
2c240 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2c250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c260 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
2c270 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
2c280 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2c290 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
2c2a0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2c2b0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
2c2c0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2c2d0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2c2e0 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
2c2f0 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
2c300 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
2c310 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
2c320 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
2c330 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2c340 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c350 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
2c360 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
2c370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2c380 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2c390 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
2c3a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2c3b0 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
2c3c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
2c3d0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2c3e0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2c3f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2c400 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
2c410 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
2c420 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
2c430 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20  nt ctrlFlags    
2c440 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
2c450 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f  r more UNIXFILE_
2c460 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  * values */.){. 
2c470 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2c480 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
2c490 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
2c4a0 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
2c4b0 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
2c4c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c4d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2c4e0 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
2c4f0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  L );..  /* Usual
2c500 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
2c510 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
2c520 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
2c530 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
2c540 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
2c550 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2c560 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
2c570 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
2c580 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
2c590 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
2c5a0 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
2c5b0 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
2c5c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2c5d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2c5e0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
2c5f0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2c600 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2c610 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
2c620 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
2c630 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2c640 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
2c650 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
2c660 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2c670 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
2c680 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f  .#endif..  /* No
2c690 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2c6a0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2c6b0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2c6c0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2c6d0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2c6e0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2c6f0 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2c700 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2c710 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2c720 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2c730 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2c740 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2c750 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2c760 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2c770 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
2c780 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
2c790 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2c7a0 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
2c7b0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2c7c0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2c7d0 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
2c7e0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2c7f0 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
2c800 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
2c810 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
2c820 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2c840 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
2c850 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2c860 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
2c870 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2c880 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
2c890 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
2c8a0 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2c8b0 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
2c8c0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2c8d0 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
2c8e0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2c8f0 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
2c900 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
2c910 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
2c920 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
2c930 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
2c940 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2c950 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
2c960 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2c970 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
2c980 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73  .  if( ctrlFlags
2c990 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
2c9a0 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  CK ){.    pLocki
2c9b0 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
2c9c0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
2c9d0 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
2c9e0 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
2c9f0 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
2ca00 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
2ca10 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
2ca20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ca30 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
2ca40 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
2ca50 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
2ca60 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
2ca70 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
2ca80 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
2ca90 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
2caa0 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
2cab0 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
2cac0 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
2cad0 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
2cae0 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
2caf0 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
2cb00 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
2cb10 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
2cb20 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2cb30 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
2cb40 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
2cb50 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
2cb60 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
2cb70 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
2cb80 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2cb90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2cba0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
2cbb0 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
2cbc0 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
2cbd0 64 73 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ds.#endif.#ifdef
2cbe0 20 53 51 4c 49 54 45 5f 53 48 41 52 45 44 5f 4d   SQLITE_SHARED_M
2cbf0 41 50 50 49 4e 47 0a 20 20 20 20 7c 7c 20 70 4c  APPING.    || pL
2cc00 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2cc10 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 0a  nolockIoMethods.
2cc20 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
2cc30 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2cc40 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2cc50 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2cc60 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2cc70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cc80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
2cc90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2cca0 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  urred in findIno
2ccb0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
2ccc0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2ccd0 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
2cce0 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
2ccf0 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
2cd00 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
2cd10 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
2cd20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
2cd30 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
2cd40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
2cd50 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
2cd60 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
2cd70 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
2cd80 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
2cd90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
2cda0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
2cdb0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
2cdc0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
2cdd0 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
2cde0 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
2cdf0 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
2ce00 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
2ce10 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
2ce20 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
2ce30 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
2ce40 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
2ce50 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
2ce60 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
2ce70 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
2ce80 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
2ce90 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
2cea0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
2ceb0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
2cec0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
2ced0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2cee0 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
2cef0 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
2cf00 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
2cf10 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
2cf20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
2cf30 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
2cf40 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
2cf50 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
2cf60 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
2cf70 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
2cf80 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
2cf90 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
2cfa0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
2cfb0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
2cfc0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
2cfd0 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
2cfe0 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
2cff0 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
2d000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d010 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2d020 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2d030 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
2d040 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2d050 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
2d060 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2d070 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2d080 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2d090 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
2d0a0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2d0b0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2d0c0 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
2d0d0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2d0e0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2d0f0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2d100 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2d110 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
2d120 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
2d130 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2d140 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
2d150 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2d160 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
2d170 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
2d180 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
2d190 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
2d1a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2d1b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d1c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d1d0 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
2d1e0 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
2d1f0 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
2d200 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
2d210 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f  ed.      ** acco
2d220 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65  rding to require
2d230 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f  ment F11141.  So
2d240 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
2d250 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20  to make a.      
2d260 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  ** copy of the f
2d270 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ilename. */.    
2d280 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
2d290 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
2d2a0 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64    pCtx->reserved
2d2b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e   = 0;.      sran
2d2c0 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
2d2d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2d2e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e  ;.      rc = fin
2d2f0 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2d300 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2d310 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d330 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d340 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  (pNew->lockingCo
2d350 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
2d360 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2d370 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2d380 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  .        h = -1;
2d390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
2d3a0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d3b0 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
2d3c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
2d3d0 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2d3e0 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
2d3f0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2d400 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
2d410 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2d420 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2d430 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2d440 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
2d450 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
2d460 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
2d470 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
2d480 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
2d490 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ame;.    assert(
2d4a0 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b   zFilename!=0 );
2d4b0 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
2d4c0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69   (int)strlen(zFi
2d4d0 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
2d4e0 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
2d4f0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
2d500 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29  loc64(nFilename)
2d510 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
2d520 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2d530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2d540 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  M_BKPT;.    }els
2d550 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2d560 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
2d570 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20  ame, zLockFile, 
2d580 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  "%s" DOTLOCK_SUF
2d590 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  FIX, zFilename);
2d5a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
2d5b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2d5c0 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d  = zLockFile;.  }
2d5d0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2d5e0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2d5f0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65  kingStyle == &se
2d600 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  mIoMethods ){.  
2d610 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70    /* Named semap
2d620 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  hore locking use
2d630 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2d640 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2d650 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65  e.    ** include
2d660 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b  d in the semLock
2d670 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a  ingContext.    *
2d680 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
2d690 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2d6a0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2d6b0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2d6c0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  de);.    if( (rc
2d6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
2d6e0 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70  (pNew->pInode->p
2d6f0 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20  Sem==NULL) ){.  
2d700 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61      char *zSemNa
2d710 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  me = pNew->pInod
2d720 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  e->aSemName;.   
2d730 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
2d740 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d750 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
2d760 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65  SemName, "/%s.se
2d770 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m",.            
2d780 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
2d790 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
2d7a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
2d7b0 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b  ( n=1; zSemName[
2d7c0 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20  n]; n++ ).      
2d7d0 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e    if( zSemName[n
2d7e0 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d  ]=='/' ) zSemNam
2d7f0 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20  e[n] = '_';.    
2d800 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2d810 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28  pSem = sem_open(
2d820 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41  zSemName, O_CREA
2d830 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20  T, 0666, 1);.   
2d840 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e     if( pNew->pIn
2d850 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d  ode->pSem == SEM
2d860 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
2d870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2d880 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2d890 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2d8a0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
2d8b0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
2d8c0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2d8d0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2d8e0 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61  dif.  .  storeLa
2d8f0 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29  stErrno(pNew, 0)
2d900 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
2d910 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2d920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2d930 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2d940 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2d950 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20  INE__);.    h = 
2d960 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  -1;.    osUnlink
2d970 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
2d980 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2d990 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
2d9a0 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ETE;.  }.#endif.
2d9b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d9c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2d9d0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2d9e0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2d9f0 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
2da00 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
2da10 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
2da20 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
2da30 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69  er(+1);.    veri
2da40 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a  fyDbFile(pNew);.
2da50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2da60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2da70 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
2da80 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63  irectory in whic
2da90 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61  h to put tempora
2daa0 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20  ry files..** If 
2dab0 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70  no suitable temp
2dac0 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63  orary file direc
2dad0 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e  tory can be foun
2dae0 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  d, return NULL..
2daf0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2db00 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
2db10 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73  leDir(void){.  s
2db20 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2db30 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
2db40 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
2db50 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
2db60 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
2db70 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
2db80 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e     ".".  };.  un
2db90 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30  signed int i = 0
2dba0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
2dbb0 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
2dbc0 72 20 2a 7a 44 69 72 20 3d 20 73 71 6c 69 74 65  r *zDir = sqlite
2dbd0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
2dbe0 3b 0a 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  ;..  if( !azDirs
2dbf0 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20  [0] ) azDirs[0] 
2dc00 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
2dc10 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28  _TMPDIR");.  if(
2dc20 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
2dc30 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
2dc40 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 77 68  ("TMPDIR");.  wh
2dc50 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20  ile(1){.    if( 
2dc60 7a 44 69 72 21 3d 30 0a 20 20 20 20 20 26 26 20  zDir!=0.     && 
2dc70 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75  osStat(zDir, &bu
2dc80 66 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 53 5f  f)==0.     && S_
2dc90 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
2dca0 65 29 0a 20 20 20 20 20 26 26 20 6f 73 41 63 63  e).     && osAcc
2dcb0 65 73 73 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30  ess(zDir, 03)==0
2dcc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
2dcd0 74 75 72 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d  turn zDir;.    }
2dce0 0a 20 20 20 20 69 66 28 20 69 3e 3d 73 69 7a 65  .    if( i>=size
2dcf0 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
2dd00 66 28 61 7a 44 69 72 73 5b 30 5d 29 20 29 20 62  f(azDirs[0]) ) b
2dd10 72 65 61 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d  reak;.    zDir =
2dd20 20 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20   azDirs[i++];.  
2dd30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2dd40 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2dd50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
2dd60 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
2dd70 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  uf must be alloc
2dd80 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
2dd90 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61  alling process a
2dda0 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  nd must be big e
2ddb0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74  nough to hold at
2ddc0 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e   least.** pVfs->
2ddd0 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
2dde0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ddf0 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
2de00 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2de10 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63  zBuf){.  const c
2de20 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74  har *zDir;.  int
2de30 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20   iLimit = 0;..  
2de40 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
2de50 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
2de60 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
2de70 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
2de80 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
2de90 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
2dea0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
2deb0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
2dec0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
2ded0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
2dee0 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d   .  */.  zBuf[0]
2def0 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65   = 0;.  Simulate
2df00 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2df10 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
2df20 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65  .  zDir = unixTe
2df30 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69  mpFileDir();.  i
2df40 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 65 74  f( zDir==0 ) ret
2df50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2df60 5f 47 45 54 54 45 4d 50 50 41 54 48 3b 0a 20 20  _GETTEMPPATH;.  
2df70 64 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  do{.    u64 r;. 
2df80 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
2df90 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
2dfa0 20 26 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74   &r);.    assert
2dfb0 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20 20  ( nBuf>2 );.    
2dfc0 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30  zBuf[nBuf-2] = 0
2dfd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2dfe0 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
2dff0 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2e000 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 22  EMP_FILE_PREFIX"
2e010 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20 20 20  %llx%c",.       
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44                zD
2e030 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20 69  ir, r, 0);.    i
2e040 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21  f( zBuf[nBuf-2]!
2e050 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29  =0 || (iLimit++)
2e060 3e 31 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >10 ) return SQL
2e070 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68  ITE_ERROR;.  }wh
2e080 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
2e090 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
2e0a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e0b0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
2e0c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e0d0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
2e0e0 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
2e0f0 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
2e100 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
2e110 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
2e120 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
2e130 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2e140 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
2e150 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
2e160 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
2e170 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
2e180 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2e190 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
2e1a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2e1b0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
2e1c0 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
2e1d0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
2e1e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
2e1f0 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
2e200 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2e210 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
2e220 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2e230 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
2e240 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
2e250 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
2e260 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
2e270 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
2e280 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
2e290 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
2e2a0 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
2e2b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2e2c0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
2e2d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2e2e0 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
2e2f0 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
2e300 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
2e310 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
2e320 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
2e330 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2e340 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e350 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
2e360 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
2e370 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
2e380 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
2e390 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
2e3a0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
2e3b0 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
2e3c0 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
2e3d0 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
2e3e0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
2e3f0 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
2e400 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
2e410 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
2e420 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
2e430 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
2e440 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
2e450 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
2e460 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
2e470 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
2e480 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2e490 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2e4a0 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
2e4b0 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
2e4c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e4d0 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
2e4e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2e4f0 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
2e500 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
2e510 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
2e520 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
2e530 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
2e540 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
2e550 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
2e560 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
2e570 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e580 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
2e590 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
2e5a0 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
2e5b0 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
2e5c0 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
2e5d0 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
2e5e0 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
2e5f0 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
2e600 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
2e610 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
2e620 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
2e630 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
2e640 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
2e650 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
2e660 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
2e670 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
2e680 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
2e690 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
2e6a0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6c0 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
2e6d0 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
2e6e0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2e6f0 29 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  );..  /* A stat(
2e700 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
2e710 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
2e720 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
2e730 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
2e740 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
2e750 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
2e760 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
2e770 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
2e780 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
2e790 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
2e7a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
2e7b0 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
2e7c0 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
2e7d0 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
2e7e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
2e7f0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
2e800 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
2e810 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
2e820 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
2e830 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
2e840 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2e850 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
2e860 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
2e870 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
2e880 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
2e890 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
2e8a0 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
2e8b0 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
2e8c0 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20  a reusable file 
2e8d0 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
2e8e0 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
2e8f0 66 28 20 6e 55 6e 75 73 65 64 46 64 3e 30 20 26  f( nUnusedFd>0 &
2e900 26 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  & 0==osStat(zPat
2e910 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2e920 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
2e930 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49  *pInode;..    pI
2e940 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
2e950 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e  ;.    while( pIn
2e960 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e  ode && (pInode->
2e970 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61  fileId.dev!=sSta
2e980 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20  t.st_dev.       
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2e9a0 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e   pInode->fileId.
2e9b0 69 6e 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e  ino!=(u64)sStat.
2e9c0 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
2e9d0 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
2e9e0 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
2e9f0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
2ea00 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
2ea10 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
2ea20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
2ea30 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
2ea40 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
2ea50 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
2ea60 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
2ea70 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
2ea80 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
2ea90 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 55 6e  d ){.        nUn
2eaa0 75 73 65 64 46 64 2d 2d 3b 0a 20 20 20 20 20 20  usedFd--;.      
2eab0 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
2eac0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
2ead0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78      }.  }.  unix
2eae0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 23 65  LeaveMutex();.#e
2eaf0 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
2eb00 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
2eb10 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
2eb20 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2eb30 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67   mode, uid and g
2eb40 69 64 20 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65  id of file zFile
2eb50 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
2eb60 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20   getFileMode(.  
2eb70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2eb80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2eb90 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  /* File name */.
2eba0 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c    mode_t *pMode,
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebc0 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
2ebd0 73 69 6f 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a  sions of zFile *
2ebe0 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c  /.  uid_t *pUid,
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec00 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20      /* OUT: uid 
2ec10 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67  of zFile. */.  g
2ec20 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec40 2a 20 4f 55 54 3a 20 67 69 64 20 6f 66 20 7a 46  * OUT: gid of zF
2ec50 69 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ile. */.){.  str
2ec60 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec80 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
2ec90 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
2eca0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
2ecb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
2ecc0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65   0==osStat(zFile
2ecd0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2ece0 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e   *pMode = sStat.
2ecf0 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a  st_mode & 0777;.
2ed00 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
2ed10 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70  t.st_uid;.    *p
2ed20 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67  Gid = sStat.st_g
2ed30 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  id;.  }else{.   
2ed40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2ed50 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
2ed60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ed70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ed80 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
2ed90 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
2eda0 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
2edb0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
2edc0 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
2edd0 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
2ede0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2edf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
2ee00 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
2ee10 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
2ee20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
2ee30 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2ee40 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
2ee50 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2ee60 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
2ee70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2ee80 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2ee90 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
2eea0 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2eeb0 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
2eec0 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
2eed0 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
2eee0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
2eef0 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77  s *pMode to 0, w
2ef00 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
2ef10 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f  .** an indicatio
2ef20 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e  n to robust_open
2ef30 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  () to create the
2ef40 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53   file using.** S
2ef50 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2ef60 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61  LE_PERMISSIONS a
2ef70 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75  djusted by the u
2ef80 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20  mask..** But if 
2ef90 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2efa0 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
2efb0 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
2efc0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
2efd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
2efe0 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
2eff0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
2f000 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
2f010 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
2f020 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2f030 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
2f040 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
2f050 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
2f060 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
2f070 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
2f080 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
2f090 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
2f0a0 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
2f0b0 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
2f0c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2f0d0 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
2f0e0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
2f0f0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2f100 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
2f110 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
2f120 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
2f130 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
2f140 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
2f150 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
2f160 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
2f170 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
2f180 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
2f190 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
2f1a0 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
2f1b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2f1c0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2f1d0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2f1e0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2f1f0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
2f200 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
2f210 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
2f220 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f240 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
2f250 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
2f260 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
2f270 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c    mode_t *pMode,
2f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f290 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
2f2a0 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
2f2b0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64  le with */.  uid
2f2c0 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f2e0 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20  OUT: uid to set 
2f2f0 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  on the file */. 
2f300 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20   gid_t *pGid    
2f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f320 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20   /* OUT: gid to 
2f330 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  set on the file 
2f340 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2f350 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2f360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f370 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f  n Code */.  *pMo
2f380 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20  de = 0;.  *pUid 
2f390 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30  = 0;.  *pGid = 0
2f3a0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2f3b0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
2f3c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2f3d0 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
2f3e0 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50    char zDb[MAX_P
2f3f0 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20  ATHNAME+1];     
2f400 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2f410 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
2f420 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
2f430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f440 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
2f450 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20  tes in zDb */.. 
2f460 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
2f470 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
2f480 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
2f490 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2f4a0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
2f4b0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
2f4c0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
2f4d0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
2f4e0 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
2f4f0 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
2f500 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
2f510 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
2f520 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
2f530 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2f540 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
2f550 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2f560 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
2f570 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
2f580 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
2f590 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2f5a0 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
2f5b0 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
2f5c0 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
2f5d0 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
2f5e0 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
2f5f0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
2f600 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
2f610 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
2f620 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
2f630 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2f640 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
2f650 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  e( zPath[nDb]!='
2f660 2d 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  -' ){.#ifndef SQ
2f670 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2f680 4e 41 4d 45 53 0a 20 20 20 20 20 20 2f 2a 20 49  NAMES.      /* I
2f690 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73  n the normal cas
2f6a0 65 20 28 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  e (8+3 filenames
2f6b0 20 64 69 73 61 62 6c 65 64 29 20 74 68 65 20 6a   disabled) the j
2f6c0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2f6d0 20 20 20 20 20 20 2a 2a 20 69 73 20 67 75 61 72        ** is guar
2f6e0 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69  anteed to contai
2f6f0 6e 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65  n a '-' characte
2f700 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
2f710 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20  rt( nDb>0 );.   
2f720 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2f730 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
2f740 6e 44 62 5d 29 20 29 3b 0a 23 65 6c 73 65 0a 20  nDb]) );.#else. 
2f750 20 20 20 20 20 2f 2a 20 49 66 20 38 2b 33 20 6e       /* If 8+3 n
2f760 61 6d 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  ames are possibl
2f770 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
2f780 6e 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  nal file might n
2f790 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  ot contain.     
2f7a0 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63   ** a '-' charac
2f7b0 74 65 72 2e 20 20 53 6f 20 63 68 65 63 6b 20 66  ter.  So check f
2f7c0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 64  or that case and
2f7d0 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
2f7e0 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d  /.      if( nDb=
2f7f0 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
2f800 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53  =='.' ) return S
2f810 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2f820 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2f830 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a    }.    memcpy(z
2f840 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
2f850 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
2f860 27 5c 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20  '\0';..    rc = 
2f870 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c  getFileMode(zDb,
2f880 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47   pMode, pUid, pG
2f890 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  id);.  }else if(
2f8a0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2f8b0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2f8c0 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
2f8d0 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65   = 0600;.  }else
2f8e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2f8f0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a  ITE_OPEN_URI ){.
2f900 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2f910 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73  s a main databas
2f920 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
2f930 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75  ile was opened u
2f940 73 69 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a  sing a URI.    *
2f950 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63  * filename, chec
2f960 6b 20 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f  k for the "modeo
2f970 66 22 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66  f" parameter. If
2f980 20 70 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70   present, interp
2f990 72 65 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76  ret.    ** its v
2f9a0 61 6c 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61  alue as a filena
2f9b0 6d 65 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f  me and try to co
2f9c0 70 79 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  py the mode, uid
2f9d0 20 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20   and gid from.  
2f9e0 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20    ** that file. 
2f9f0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
2fa00 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
2fa10 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50  uri_parameter(zP
2fa20 61 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a  ath, "modeof");.
2fa30 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
2fa40 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d     rc = getFileM
2fa50 6f 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55  ode(z, pMode, pU
2fa60 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d  id, pGid);.    }
2fa70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2fa80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2fa90 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
2faa0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
2fab0 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
2fac0 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
2fad0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
2fae0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
2faf0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
2fb00 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2fb10 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
2fb20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2fb30 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
2fb40 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2fb50 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
2fb60 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
2fb70 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
2fb80 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
2fb90 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
2fba0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
2fbb0 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
2fbc0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
2fbd0 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
2fbe0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
2fbf0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
2fc00 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
2fc10 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2fc20 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
2fc30 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
2fc40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2fc50 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
2fc60 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
2fc70 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
2fc80 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
2fc90 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2fca0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
2fcb0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
2fcc0 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
2fcd0 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
2fce0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
2fcf0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
2fd00 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
2fd10 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
2fd20 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
2fd30 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
2fd40 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
2fd50 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
2fd60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2fd70 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
2fd80 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2fd90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2fda0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
2fdb0 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
2fdc0 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2fdd0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2fde0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
2fdf0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2fe00 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2fe10 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2fe20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2fe30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2fe40 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
2fe50 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe70 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
2fe80 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
2fe90 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
2fea0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
2feb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2fec0 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
2fed0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
2fee0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
2fef0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
2ff00 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
2ff10 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
2ff20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ff30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
2ff40 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
2ff50 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
2ff60 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2ff70 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
2ff80 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
2ff90 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
2ffa0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
2ffb0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
2ffc0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2ffd0 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
2ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fff0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
30000 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
30010 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
30020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30030 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
30040 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
30050 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
30060 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
30070 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
30080 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
30090 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
300a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
300b0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
300c0 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
300d0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
300e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
300f0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
30100 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
30110 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
30120 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
30130 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
30140 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
30150 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30160 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
30170 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
30180 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
30190 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
301a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
301b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
301c0 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
301d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
301e0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
301f0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
30200 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
30210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30220 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
30230 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
30240 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
30250 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
30260 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
30270 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
30280 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
30290 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
302a0 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
302b0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
302c0 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
302d0 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
302e0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
302f0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
30300 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
30310 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
30320 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
30330 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
30340 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
30350 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
30360 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
30370 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
30380 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30390 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
303a0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
303b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
303c0 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
303d0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
303e0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
303f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30400 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
30410 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
30420 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
30430 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
30440 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
30450 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
30460 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
30470 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
30480 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
30490 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
304a0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
304b0 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
304c0 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
304d0 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
304e0 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
304f0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
30500 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
30510 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
30520 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
30530 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
30540 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
30550 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
30560 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
30570 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
30580 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
30590 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
305a0 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
305b0 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
305c0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
305d0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
305e0 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
305f0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
30600 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
30610 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
30620 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
30630 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
30640 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
30650 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
30660 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
30670 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
30680 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
30690 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
306a0 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
306b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
306c0 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
306d0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
306e0 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
306f0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
30700 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
30710 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
30720 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
30730 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
30740 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
30750 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30760 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
30770 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
30780 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
30790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
307a0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
307b0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
307c0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
307d0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
307e0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
307f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
30800 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
30810 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
30820 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
30830 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
30840 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
30850 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
30860 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
30870 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
30880 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
30890 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
308a0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
308b0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
308c0 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
308d0 70 65 3d 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 7c 7c 20  MAIN_JOURNAL || 
308f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30900 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
30910 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
30920 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
30930 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
30940 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
30950 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
30960 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
30970 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
30980 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
30990 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
309a0 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
309b0 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
309c0 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
309d0 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
309e0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
309f0 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
30a00 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
30a10 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
30a20 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
30a30 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
30a40 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
30a50 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
30a60 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
30a70 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
30a80 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
30a90 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
30aa0 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47  ndomnessPid!=osG
30ab0 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20  etpid(0) ){.    
30ac0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
30ad0 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20  osGetpid(0);.   
30ae0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
30af0 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ess(0,0);.  }.. 
30b00 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
30b10 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
30b20 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
30b30 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30b40 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
30b50 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
30b60 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
30b70 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
30b80 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
30b90 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
30ba0 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
30bb0 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
30bc0 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
30bd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
30be0 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
30bf0 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
30c00 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
30c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30c20 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
30c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
30c40 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65   p->pPreallocate
30c50 64 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  dUnused = pUnuse
30c60 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
30c70 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
30c80 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
30c90 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
30ca0 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
30cb0 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
30cc0 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
30cd0 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
30ce0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
30cf0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
30d00 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
30d10 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
30d20 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
30d30 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
30d40 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
30d50 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
30d60 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
30d70 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
30d80 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
30d90 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
30da0 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
30db0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
30dc0 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
30dd0 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
30de0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  nixGetTempname(p
30df0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
30e00 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
30e10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30e20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
30e30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
30e40 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  zName = zTmpname
30e50 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
30e60 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ted temporary fi
30e70 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61  lenames are alwa
30e80 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  ys double-zero t
30e90 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a  erminated.    **
30ea0 20 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69   for use by sqli
30eb0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
30ec0 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
30ed0 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e  rt( zName[strlen
30ee0 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
30ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
30f00 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f  mine the value o
30f10 66 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  f the flags para
30f20 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
30f30 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20  POSIX function. 
30f40 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73   ** open(). Thes
30f50 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c  e must be calcul
30f60 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65  ated even if ope
30f70 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
30f80 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20  d, as.  ** they 
30f90 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
30fa0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
30fb0 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65  e handle and use
30fc0 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27  d by the .  ** '
30fd0 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b  conch file' lock
30fe0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61  ing functions la
30ff0 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66  ter on.  */.  if
31000 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
31010 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
31020 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52  DONLY;.  if( isR
31030 65 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46  eadWrite ) openF
31040 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a  lags |= O_RDWR;.
31050 20 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29    if( isCreate )
31060 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d      openFlags |=
31070 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20   O_CREAT;.  if( 
31080 69 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70  isExclusive ) op
31090 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58  enFlags |= (O_EX
310a0 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a  CL|O_NOFOLLOW);.
310b0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28    openFlags |= (
310c0 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
310d0 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64  NARY);..  if( fd
310e0 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74  <0 ){.    mode_t
310f0 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
31100 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69          /* Permi
31110 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ssions to create
31120 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20   file with */.  
31130 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31150 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
31160 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69  e file */.    gi
31170 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20  d_t gid;        
31180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
31190 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66  roupid for the f
311a0 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
311b0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
311c0 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c  de(zName, flags,
311d0 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64   &openMode, &uid
311e0 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28  , &gid);.    if(
311f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31200 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31210 21 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  !p->pPreallocate
31220 64 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20  dUnused );.     
31230 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
31240 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
31250 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
31260 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31270 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AL );.      retu
31280 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
31290 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
312a0 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  n(zName, openFla
312b0 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20  gs, openMode);. 
312c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
312d0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
312e0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
312f0 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20  openFlags));.   
31300 20 61 73 73 65 72 74 28 20 21 69 73 45 78 63 6c   assert( !isExcl
31310 75 73 69 76 65 20 7c 7c 20 28 6f 70 65 6e 46 6c  usive || (openFl
31320 61 67 73 20 26 20 4f 5f 43 52 45 41 54 29 21 3d  ags & O_CREAT)!=
31330 30 20 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  0 );.    if( fd<
31340 30 20 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44  0 && errno!=EISD
31350 49 52 20 26 26 20 69 73 52 65 61 64 57 72 69 74  IR && isReadWrit
31360 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61  e ){.      /* Fa
31370 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  iled to open the
31380 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77   file for read/w
31390 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 72 79  rite access. Try
313a0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20   read-only. */. 
313b0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
313c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
313d0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
313e0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
313f0 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28   openFlags &= ~(
31400 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b  O_RDWR|O_CREAT);
31410 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
31420 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31430 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ONLY;.      open
31440 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c  Flags |= O_RDONL
31450 59 3b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f  Y;.      isReado
31460 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  nly = 1;.      f
31470 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
31480 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
31490 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
314a0 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20   }.    if( fd<0 
314b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
314c0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
314d0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
314e0 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
314f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
31500 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
31510 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
31520 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e   process is runn
31530 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20  ing as root and 
31540 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  if creating a ne
31550 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a  w rollback.    *
31560 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c  * journal or WAL
31570 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f   file, set the o
31580 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
31590 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74  journal or WAL t
315a0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  o be.    ** the 
315b0 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67  same as the orig
315c0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20  inal database.. 
315d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c     */.    if( fl
315e0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
315f0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
31600 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
31610 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
31620 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c 20  Fchown(fd, uid, 
31630 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gid);.    }.  }.
31640 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20    assert( fd>=0 
31650 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  );.  if( pOutFla
31660 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
31670 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
31680 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  }..  if( p->pPre
31690 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20  allocatedUnused 
316a0 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c  ){.    p->pPreal
316b0 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e 66  locatedUnused->f
316c0 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70  d = fd;.    p->p
316d0 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
316e0 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  ed->flags = flag
316f0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  s;.  }..  if( is
31700 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53  Delete ){.#if OS
31710 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61  _VXWORKS.    zPa
31720 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69  th = zName;.#eli
31730 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
31740 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c  _UNLINK_AFTER_CL
31750 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d  OSE).    zPath =
31760 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
31770 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ("%s", zName);. 
31780 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20     if( zPath==0 
31790 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
317a0 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
317b0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65  INE__);.      re
317c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
317d0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  M_BKPT;.    }.#e
317e0 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
317f0 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
31800 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
31810 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
31820 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
31830 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
31840 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
31850 6e 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66 69  ndif.  .#if defi
31860 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
31870 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
31880 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
31890 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
318a0 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
318b0 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
318c0 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b 0a  rrno(p, errno);.
318d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
318e0 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (p, fd, __LINE__
318f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
31900 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
31910 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
31920 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f 73  = strncmp("msdos
31930 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
31940 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
31950 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
31960 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
31970 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
31980 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20 20  IS_MSDOS;.  }.  
31990 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
319a0 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f  ("exfat", fsInfo
319b0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
319c0 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
319d0 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
319e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
319f0 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
31a00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
31a10 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72  * Set up appropr
31a20 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a  iate ctrlFlags *
31a30 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  /.  if( isDelete
31a40 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
31a50 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
31a60 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
31a70 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
31a80 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
31a90 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
31aa0 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  XFILE_RDONLY;.  
31ab0 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
31ac0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31ad0 5f 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63  _DB;.  if( noLoc
31ae0 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  k )             
31af0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
31b00 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
31b10 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72  K;.  if( syncDir
31b20 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
31b30 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
31b40 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
31b50 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
31b60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
31b70 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ) ctrlFlags |= U
31b80 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69  NIXFILE_URI;..#i
31b90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31ba0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
31bb0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
31bc0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
31bd0 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
31be0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
31bf0 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
31c00 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
31c10 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
31c20 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
31c30 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
31c40 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
31c50 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
31c60 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
31c70 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
31c80 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
31c90 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
31ca0 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
31cb0 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
31cc0 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
31cd0 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
31ce0 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
31cf0 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
31d00 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
31d10 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
31d20 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
31d30 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
31d40 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
31d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31d60 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73   useProxy = !(fs
31d70 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
31d80 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  _LOCAL);.    }. 
31d90 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20     if( useProxy 
31da0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  ){.      rc = fi
31db0 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
31dc0 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
31dd0 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
31de0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
31df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31e00 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
31e10 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
31e20 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
31e30 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
31e40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31e60 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
31e70 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
31e80 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
31e90 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
31ea0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
31eb0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
31ec0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
31ed0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
31ee0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
31ef0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
31f00 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
31f10 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
31f20 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
31f30 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
31f40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31f50 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
31f60 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
31f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
31f80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31f90 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
31fa0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
31fb0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
31fc0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
31fd0 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
31fe0 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
31ff0 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  s);..open_finish
32000 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
32010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
32020 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
32030 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
32040 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
32050 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
32060 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
32070 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
32080 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
32090 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
320a0 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
320b0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
320c0 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
320d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
320e0 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
320f0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
32100 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
32110 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
32120 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
32130 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
32140 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
32150 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
32160 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
32170 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
32180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32190 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
321a0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
321b0 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
321c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
321d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
321e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
321f0 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
32200 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
32210 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
32220 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
32230 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
32240 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  ) ){.    if( err
32250 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f  no==ENOENT.#if O
32260 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
32270 20 20 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a 50    || osAccess(zP
32280 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66  ath,0)!=0.#endif
32290 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
322a0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
322b0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20  DELETE_NOENT;.  
322c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
322d0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
322e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
322f0 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20  LETE, "unlink", 
32300 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
32310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
32320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32330 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
32340 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 26    if( (dirSync &
32350 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e   1)!=0 ){.    in
32360 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
32370 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a  sOpenDirectory(z
32380 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
32390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
323a0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  K ){.      if( f
323b0 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c 30 2c 30  ull_fsync(fd,0,0
323c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
323d0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
323e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
323f0 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20  FSYNC, "fsync", 
32400 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
32410 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
32420 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
32430 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  __);.    }else{.
32440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32450 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
32460 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  N );.      rc = 
32470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
32480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
32490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
324a0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
324b0 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ence of or acces
324c0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
324d0 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
324e0 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
324f0 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
32500 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
32510 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
32520 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
32530 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
32540 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
32550 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
32560 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
32570 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
32580 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
32590 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
325a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
325b0 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
325c0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
325d0 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
325e0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
325f0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
32600 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
32610 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32620 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
32630 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
32640 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
32650 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
32660 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
32670 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
32680 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
32690 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
326a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
326b0 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
326c0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
326d0 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
326e0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
326f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
32700 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
32710 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 55  n here */.){.  U
32720 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32730 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
32740 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
32750 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
32760 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 61 73  _ACCESS; );.  as
32770 73 65 72 74 28 20 70 52 65 73 4f 75 74 21 3d 30  sert( pResOut!=0
32780 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70   );..  /* The sp
32790 65 63 20 73 61 79 73 20 74 68 65 72 65 20 61 72  ec says there ar
327a0 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
327b0 20 76 61 6c 75 65 73 20 66 6f 72 20 66 6c 61 67   values for flag
327c0 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20 20 2a  s.  But only.  *
327d0 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d 20 61 72  * two of them ar
327e0 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20  e actually used 
327f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  */.  assert( fla
32800 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
32810 53 5f 45 58 49 53 54 53 20 7c 7c 20 66 6c 61 67  S_EXISTS || flag
32820 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
32830 5f 52 45 41 44 57 52 49 54 45 20 29 3b 0a 0a 20  _READWRITE );.. 
32840 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
32850 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
32860 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
32870 74 61 74 20 62 75 66 3b 0a 20 20 20 20 2a 70 52  tat buf;.    *pR
32880 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f 73 53 74  esOut = (0==osSt
32890 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20  at(zPath, &buf) 
328a0 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3e 30  && buf.st_size>0
328b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
328c0 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73 41 63 63  *pResOut = osAcc
328d0 65 73 73 28 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c  ess(zPath, W_OK|
328e0 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  R_OK)==0;.  }.  
328f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
32910 61 74 69 63 20 69 6e 74 20 6d 6b 46 75 6c 6c 50  atic int mkFullP
32920 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
32930 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
32940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32950 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 63 68  put path */.  ch
32960 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20  ar *zOut,       
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32980 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
32990 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20 20 20 20  /.  int nOut    
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329b0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
329c0 20 73 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   size of buffer 
329d0 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zOut */.){.  int
329e0 20 6e 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33   nPath = sqlite3
329f0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 3b  Strlen30(zPath);
32a00 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
32a10 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21  .  if( zPath[0]!
32a20 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='/' ){.    if( 
32a30 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  osGetcwd(zOut, n
32a40 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-2)==0 ){.   
32a50 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
32a60 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
32a70 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65  NTOPEN_BKPT, "ge
32a80 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20  tcwd", zPath);. 
32a90 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
32aa0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
32ab0 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f 75 74 5b  zOut);.    zOut[
32ac0 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27 3b 0a 20  iOff++] = '/';. 
32ad0 20 7d 0a 20 20 69 66 28 20 28 69 4f 66 66 2b 6e   }.  if( (iOff+n
32ae0 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20 29 7b 0a  Path+1)>nOut ){.
32af0 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 61 73      /* SQLite as
32b00 73 75 6d 65 73 20 74 68 61 74 20 78 46 75 6c 6c  sumes that xFull
32b10 50 61 74 68 6e 61 6d 65 28 29 20 6e 75 6c 2d 74  Pathname() nul-t
32b20 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 6f 75  erminates the ou
32b30 74 70 75 74 20 62 75 66 66 65 72 0a 20 20 20 20  tput buffer.    
32b40 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20 72 65  ** even if it re
32b50 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20  turns an error. 
32b60 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66   */.    zOut[iOf
32b70 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72  f] = '\0';.    r
32b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
32b90 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a  TOPEN_BKPT;.  }.
32ba0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32bb0 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c 20 26 7a  tf(nOut-iOff, &z
32bc0 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25 73 22 2c  Out[iOff], "%s",
32bd0 20 7a 50 61 74 68 29 3b 0a 20 20 72 65 74 75 72   zPath);.  retur
32be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32bf0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
32c00 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
32c10 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
32c20 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
32c30 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
32c40 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
32c50 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
32c60 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
32c70 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
32c80 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
32c90 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
32ca0 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
32cb0 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
32cc0 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
32cd0 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
32ce0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
32cf0 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
32d00 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
32d10 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
32d20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32d40 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
32d50 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
32d60 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
32d70 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
32d80 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
32d90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
32da0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
32db0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
32dc0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
32dd0 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32df0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
32e00 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
32e10 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
32e20 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
32e30 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
32e40 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66  buffer */.){.#if
32e50 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52   !defined(HAVE_R
32e60 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21 64 65 66  EADLINK) || !def
32e70 69 6e 65 64 28 48 41 56 45 5f 4c 53 54 41 54 29  ined(HAVE_LSTAT)
32e80 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46 75 6c 6c  .  return mkFull
32e90 50 61 74 68 6e 61 6d 65 28 7a 50 61 74 68 2c 20  Pathname(zPath, 
32ea0 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 23 65 6c  zOut, nOut);.#el
32eb0 73 65 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  se.  int rc = SQ
32ec0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
32ed0 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Byte;.  int nLin
32ee0 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
32ef0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32f00 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  of symbolic link
32f10 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f 20 66 61  s followed so fa
32f20 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
32f30 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74 68 3b 20  r *zIn = zPath; 
32f40 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61       /* Input pa
32f50 74 68 20 66 6f 72 20 65 61 63 68 20 69 74 65 72  th for each iter
32f60 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f  ation of loop */
32f70 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 20 3d 20  .  char *zDel = 
32f80 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  0;..  assert( pV
32f90 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
32fa0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
32fb0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32fc0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20  ER(pVfs);..  /* 
32fd0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
32fe0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
32ff0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
33000 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
33010 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
33020 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
33030 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
33040 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
33050 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
33060 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
33070 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
33080 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
33090 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
330a0 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
330b0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
330c0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
330d0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
330e0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
330f0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
33100 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  do {..    /* Cal
33110 6c 20 73 74 61 74 28 29 20 6f 6e 20 70 61 74 68  l stat() on path
33120 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69 6e 6b 20   zIn. Set bLink 
33130 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 70  to true if the p
33140 61 74 68 20 69 73 20 61 20 73 79 6d 62 6f 6c 69  ath is a symboli
33150 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 2c 20 6f  c.    ** link, o
33160 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
33170 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  e.  */.    int b
33180 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74  Link = 0;.    st
33190 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
331a0 20 20 20 69 66 28 20 6f 73 4c 73 74 61 74 28 7a     if( osLstat(z
331b0 49 6e 2c 20 26 62 75 66 29 21 3d 30 20 29 7b 0a  In, &buf)!=0 ){.
331c0 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21        if( errno!
331d0 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
331e0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
331f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
33200 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c 73 74 61  OPEN_BKPT, "lsta
33210 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20  t", zIn);.      
33220 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
33230 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f 49 53 4c     bLink = S_ISL
33240 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b  NK(buf.st_mode);
33250 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33260 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69  bLink ){.      i
33270 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20  f( zDel==0 ){.  
33280 20 20 20 20 20 20 7a 44 65 6c 20 3d 20 73 71 6c        zDel = sql
33290 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74  ite3_malloc(nOut
332a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
332b0 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  Del==0 ) rc = SQ
332c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
332d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
332e0 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49 54 45 5f   ++nLink>SQLITE_
332f0 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 29 7b 0a  MAX_SYMLINKS ){.
33300 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33310 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33320 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  T;.      }..    
33330 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33340 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
33350 42 79 74 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e  Byte = osReadlin
33360 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20 6e 4f 75  k(zIn, zDel, nOu
33370 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t-1);.        if
33380 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20 20  ( nByte<0 ){.   
33390 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
333a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
333b0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
333c0 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49 6e 29 3b  readlink", zIn);
333d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
333e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44            if( zD
333f0 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  el[0]!='/' ){.  
33400 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
33410 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
33420 28 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  (n = sqlite3Strl
33430 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e 30 20 26  en30(zIn); n>0 &
33440 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27 2f 27 3b  & zIn[n-1]!='/';
33450 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 20 20 20   n--);.         
33460 20 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 2b 31     if( nByte+n+1
33470 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  >nOut ){.       
33480 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33490 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
334a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
334b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
334c0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 44 65 6c     memmove(&zDel
334d0 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42 79 74 65  [n], zDel, nByte
334e0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
334f0 20 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 2c 20     memcpy(zDel, 
33500 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  zIn, n);.       
33510 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20         nByte += 
33520 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n;.            }
33530 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33540 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e 42 79 74         zDel[nByt
33550 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  e] = '\0';.     
33560 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
33570 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65 6c 3b 0a      zIn = zDel;.
33580 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
33590 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
335a0 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74 20 7c 7c   || zIn!=zOut ||
335b0 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a   zIn[0]=='/' );.
335c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
335d0 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21 3d 7a 4f  TE_OK && zIn!=zO
335e0 75 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ut ){.      rc =
335f0 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   mkFullPathname(
33600 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29  zIn, zOut, nOut)
33610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33620 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72 65 61 6b  bLink==0 ) break
33630 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a 4f 75 74  ;.    zIn = zOut
33640 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
33650 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
33660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 65  sqlite3_free(zDe
33670 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
33680 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 48 41 56  .#endif   /* HAV
33690 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26 20 48 41  E_READLINK && HA
336a0 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d 0a 0a 0a  VE_LSTAT */.}...
336b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
336c0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
336d0 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
336e0 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
336f0 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
33700 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
33710 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
33720 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
33730 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
33740 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
33750 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ary..*/.#include
33760 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69   <dlfcn.h>.stati
33770 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70  c void *unixDlOp
33780 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
33790 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63  NotUsed, const c
337a0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
337b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
337c0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
337d0 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46  return dlopen(zF
337e0 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f  ilename, RTLD_NO
337f0 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29  W | RTLD_GLOBAL)
33800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  ;.}../*.** SQLit
33810 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
33820 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ction immediatel
33830 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  y after a call t
33840 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72  o unixDlSym() or
33850 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29  .** unixDlOpen()
33860 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20   fails (returns 
33870 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e  a null pointer).
33880 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69   If a more detai
33890 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  led error.** mes
338a0 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c  sage is availabl
338b0 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  e, it is written
338c0 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20   to zBufOut. If 
338d0 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
338e0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
338f0 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66  , zBufOut is lef
33900 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64  t unmodified and
33910 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64   SQLite uses a d
33920 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20  efault.** error 
33930 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
33940 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
33950 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
33960 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
33970 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
33980 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
33990 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
339a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
339b0 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ed);.  unixEnter
339c0 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
339d0 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
339e0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
339f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33a00 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
33a10 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
33a20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
33a30 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ();.}.static voi
33a40 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  d (*unixDlSym(sq
33a50 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33a60 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  ed, void *p, con
33a70 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
33a80 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a  oid){.  /* .  **
33a90 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e   GCC with -pedan
33aa0 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20  tic-errors says 
33ab0 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f  that C90 does no
33ac0 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20  t allow a void* 
33ad0 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20  to be.  ** cast 
33ae0 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
33af0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41  o a function.  A
33b00 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61  nd yet the libra
33b10 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69  ry dlsym() routi
33b20 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ne.  ** returns 
33b30 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73  a void* which is
33b40 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
33b50 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
33b60 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20    So how do we. 
33b70 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20   ** use dlsym() 
33b80 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
33b90 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors?.  **.  **
33ba0 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f   Variable x belo
33bb0 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  w is defined to 
33bc0 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
33bd0 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  a function takin
33be0 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  g.  ** parameter
33bf0 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73  s void* and cons
33c00 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75  t char* and retu
33c10 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  rning a pointer 
33c20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  to a function.. 
33c30 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a   ** We initializ
33c40 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67  e x by assigning
33c50 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   it a pointer to
33c60 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e   the dlsym() fun
33c70 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61  ction..  ** (Tha
33c80 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71  t assignment req
33c90 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20  uires a cast.)  
33ca0 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65  Then we call the
33cb0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20   function that. 
33cc0 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e   ** x points to.
33cd0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
33ce0 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73  s work-around is
33cf0 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72   unlikely to wor
33d00 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61  k correctly on a
33d10 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a  ny system where.
33d20 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20    ** you really 
33d30 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75  cannot cast a fu
33d40 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
33d50 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20  nto void*.  But 
33d60 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a  then, on the.  *
33d70 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c  * other hand, dl
33d80 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77  sym() will not w
33d90 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79  ork on such a sy
33da0 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20  stem either, so 
33db0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74  we have.  ** not
33dc0 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79   really lost any
33dd0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f  thing..  */.  vo
33de0 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c  id (*(*x)(void*,
33df0 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
33e00 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
33e10 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33e20 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28  ;.  x = (void(*(
33e30 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  *)(void*,const c
33e40 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73  har*))(void))dls
33e50 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78  ym;.  return (*x
33e60 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )(p, zSym);.}.st
33e70 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
33e80 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
33e90 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
33ea0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
33eb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33ec0 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
33ed0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
33ee0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
33ef0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
33f00 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
33f10 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
33f20 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
33f30 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
33f40 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
33f50 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
33f60 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
33f70 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
33f80 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
33f90 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
33fa0 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
33fb0 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
33fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33fd0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
33fe0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
33ff0 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
34000 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
34010 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34020 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
34030 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
34040 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
34050 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
34060 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
34070 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
34080 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
34090 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
340a0 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
340b0 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
340c0 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
340d0 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
340e0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
340f0 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
34100 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
34110 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
34120 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
34130 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
34140 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
34150 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
34160 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
34170 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
34180 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
34190 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
341a0 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
341b0 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
341c0 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
341d0 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
341e0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
341f0 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
34200 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
34210 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
34220 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
34230 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
34240 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
34250 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
34260 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
34270 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
34280 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
34290 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
342a0 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
342b0 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
342c0 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
342d0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
342e0 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f  , nBuf);.  rando
342f0 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74  mnessPid = osGet
34300 70 69 64 28 30 29 3b 20 20 0a 23 69 66 20 21 64  pid(0);  .#if !d
34310 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
34320 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ST) && !defined(
34330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
34340 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20 20 20 20  OMNESS).  {.    
34350 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20  int fd, got;.   
34360 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
34370 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
34380 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
34390 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
343a0 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
343b0 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
343c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
343d0 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
343e0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
343f0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
34400 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  , &randomnessPid
34410 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e  , sizeof(randomn
34420 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20 20  essPid));.      
34430 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
34440 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e  )+sizeof(randomn
34450 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74  essPid)<=(size_t
34460 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e  )nBuf );.      n
34470 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20  Buf = sizeof(t) 
34480 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e  + sizeof(randomn
34490 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c  essPid);.    }el
344a0 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f  se{.      do{ go
344b0 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a  t = osRead(fd, z
344c0 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69  Buf, nBuf); }whi
344d0 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
344e0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
344f0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
34500 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
34510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
34520 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
34530 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
34540 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
34550 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
34560 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
34570 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
34580 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
34590 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
345a0 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
345b0 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
345c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
345d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
345e0 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
345f0 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
34600 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
34610 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
34620 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
34630 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
34640 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
34650 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
34660 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
34670 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
34680 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
34690 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
346a0 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
346b0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
346c0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
346d0 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
346e0 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
346f0 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
34700 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
34710 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
34720 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
34730 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
34740 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
34750 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
34760 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
34770 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
34780 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
34790 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
347a0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
347b0 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
347c0 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
347d0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
347e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
347f0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
34800 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
34810 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
34820 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
34830 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
34840 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
34850 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
34860 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34870 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
34880 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
34890 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
348a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
348b0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
348c0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
348d0 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
348e0 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
348f0 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
34900 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
34910 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
34920 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
34930 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
34940 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
34950 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
34960 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
34970 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
34980 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
34990 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
349a0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
349b0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
349c0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
349d0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
349e0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
349f0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
34a00 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
34a10 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
34a20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
34a30 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
34a40 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
34a50 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
34a60 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
34a70 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
34a80 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
34a90 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
34aa0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
34ab0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
34ac0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
34ad0 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
34ae0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
34af0 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
34b00 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
34b10 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
34b20 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
34b30 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
34b40 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
34b50 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
34b60 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
34b70 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
34b80 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
34b90 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
34ba0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71  vfs *NotUsed, sq
34bb0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
34bc0 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ow){.  static co
34bd0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
34be0 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
34bf0 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
34c00 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20  int64)8640000;. 
34c10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34c20 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  _OK;.#if defined
34c30 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
34c40 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
34c50 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
34c60 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
34c70 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
34c80 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
34c90 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
34ca0 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
34cb0 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
34cc0 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
34cd0 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
34ce0 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
34cf0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
34d00 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
34d10 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
34d20 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
34d30 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
34d40 0a 20 20 28 76 6f 69 64 29 67 65 74 74 69 6d 65  .  (void)gettime
34d50 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b  ofday(&sNow, 0);
34d60 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c    /* Cannot fail
34d70 20 67 69 76 65 6e 20 76 61 6c 69 64 20 61 72 67   given valid arg
34d80 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a 70 69 4e  uments */.  *piN
34d90 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
34da0 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
34db0 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
34dc0 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
34dd0 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  1000;.#endif..#i
34de0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
34df0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
34e00 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
34e10 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
34e20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
34e30 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
34e40 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
34e50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
34e60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34e70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
34e80 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
34e90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
34ea0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 46  PRECATED./*.** F
34eb0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
34ec0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
34ed0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
34ee0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
34ef0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
34f00 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
34f10 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
34f20 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
34f30 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
34f40 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
34f50 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
34f60 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
34f70 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
34f80 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
34f90 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
34fa0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
34fb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
34fc0 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
34fd0 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
34fe0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
34ff0 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
35000 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
35010 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
35020 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
35030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
35040 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 43  e.# define unixC
35050 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e  urrentTime 0.#en
35060 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  dif../*.** The x
35070 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
35080 65 74 68 6f 64 20 69 73 20 64 65 73 69 67 6e 65  ethod is designe
35090 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 62 65  d to return a be
350a0 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c 65 76 65  tter.** low-leve
350b0 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  l error message 
350c0 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
350d0 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
350e0 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
350f0 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
35100 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20 69 6e 74  n.  Only the int
35110 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
35120 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
35130 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
35140 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
35150 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
35160 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
35170 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
35180 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
35190 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
351a0 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
351b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
351c0 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
351d0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
351e0 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72  3);.  return err
351f0 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a  no;.}.../*.*****
35200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35210 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
35220 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
35230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
35250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
352a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
352e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
352f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35300 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
35310 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
35320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
35340 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
35350 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
35360 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
35370 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
35380 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
35390 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
353a0 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
353b0 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
353c0 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
353d0 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
353e0 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
353f0 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
35400 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
35410 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
35420 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
35430 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
35440 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
35450 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
35460 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
35470 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
35480 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
35490 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
354a0 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
354b0 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
354c0 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
354d0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
354e0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
354f0 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
35500 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
35510 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
35520 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
35530 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
35540 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
35550 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
35560 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
35570 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
35580 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
35590 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
355a0 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
355b0 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
355c0 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
355d0 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
355e0 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
355f0 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
35600 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
35610 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
35620 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
35630 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
35640 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
35650 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
35660 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
35670 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
35680 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
35690 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
356a0 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
356b0 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
356c0 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
356d0 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
356e0 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
356f0 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
35700 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
35710 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
35720 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
35730 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
35740 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
35750 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
35760 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
35770 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
35780 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
35790 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
357a0 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
357b0 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
357c0 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
357d0 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
357e0 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
357f0 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
35800 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
35810 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
35820 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52  000000.**      R
35830 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
35840 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
35850 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
35860 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
35870 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
35880 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
35890 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
358a0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
358b0 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
358c0 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
358d0 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
358e0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
358f0 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
35900 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
35910 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
35920 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
35930 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
35940 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
35950 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
35960 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
35970 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
35980 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
35990 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
359a0 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
359b0 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
359c0 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
359d0 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
359e0 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
359f0 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
35a00 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
35a10 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
35a20 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
35a30 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
35a40 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
35a50 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
35a60 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
35a70 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
35a80 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
35a90 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
35aa0 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
35ab0 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
35ac0 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
35ad0 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
35ae0 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
35af0 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
35b00 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
35b10 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
35b20 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
35b30 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
35b40 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
35b50 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
35b60 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
35b70 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
35b80 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
35b90 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
35ba0 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
35bb0 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
35bc0 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
35bd0 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
35be0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
35bf0 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
35c00 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
35c10 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
35c20 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
35c30 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
35c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
35c50 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
35c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
35c70 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
35c80 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
35c90 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
35ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
35cb0 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
35cc0 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
35cd0 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
35ce0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
35cf0 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
35d00 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52  FCNTL_GET_LOCKPR
35d10 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d30 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29    &<proxy_path>)
35d40 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
35d50 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
35d60 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
35d70 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
35d80 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
35d90 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
35da0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
35db0 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
35dc0 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
35dd0 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
35de0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
35df0 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
35e00 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
35e10 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
35e20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
35e30 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
35e40 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
35e50 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
35e60 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
35e70 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
35e80 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
35e90 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
35ea0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
35eb0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
35ec0 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
35ed0 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
35ee0 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
35ef0 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
35f00 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
35f10 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
35f20 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
35f30 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
35f40 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
35f50 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
35f60 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
35f70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
35f80 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
35f90 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
35fa0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
35fb0 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
35fc0 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
35fd0 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
35fe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
35ff0 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
36000 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
36010 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
36020 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
36030 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
36040 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
36050 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
36060 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
36070 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
36080 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
36090 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
360a0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
360b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
360c0 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
360d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
360e0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
360f0 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
36100 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
36110 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
36120 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
36130 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
36140 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
36150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36160 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
36170 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
36180 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
36190 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
361a0 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
361b0 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
361c0 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
361d0 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
361e0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
361f0 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
36200 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
36210 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
36220 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
36230 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
36240 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
36250 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
36260 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
36270 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
36280 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
36290 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
362a0 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
362b0 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
362c0 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
362d0 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
362e0 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
362f0 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
36300 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
36310 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
36320 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
36330 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
36340 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
36350 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
36360 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
36370 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
36380 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
36390 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
363a0 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
363b0 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
363c0 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73  ot exist, or its
363d0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
363e0 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
363f0 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
36400 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
36410 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
36420 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
36430 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
36440 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
36450 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
36460 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
36470 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
36480 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
36490 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
364a0 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
364b0 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
364c0 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
364d0 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
364e0 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
364f0 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
36500 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
36510 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
36520 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
36530 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
36540 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
36550 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
36560 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
36570 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
36580 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
36590 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
365a0 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
365b0 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
365c0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
365d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
365e0 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
365f0 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
36600 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
36610 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
36620 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
36630 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
36640 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
36650 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
36660 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
36670 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
36680 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
36690 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
366a0 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
366b0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
366c0 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
366d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
366e0 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
366f0 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
36700 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
36710 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
36720 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
36730 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
36740 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
36750 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
36760 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
36770 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
36780 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
36790 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
367a0 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
367b0 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
367c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
367d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
367e0 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
367f0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
36800 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
36810 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
36820 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
36830 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
36840 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
36850 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
36860 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
36870 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
36880 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
36890 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
368a0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
368b0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
368c0 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
368d0 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
368e0 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
368f0 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
36900 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
36910 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
36920 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
36930 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
36940 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
36950 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
36960 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
36970 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
36980 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
36990 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
369a0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
369b0 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
369c0 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
369d0 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
369e0 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
369f0 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
36a00 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
36a10 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
36a20 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
36a30 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
36a40 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
36a50 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
36a60 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
36a70 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
36a80 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
36a90 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
36aa0 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
36ab0 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
36ac0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
36ad0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
36ae0 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
36af0 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
36b00 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
36b10 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
36b20 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
36b30 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
36b40 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
36b50 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
36b60 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
36b70 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
36b80 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
36b90 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
36ba0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
36bb0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
36bc0 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
36bd0 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
36be0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
36bf0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
36c00 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
36c10 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
36c20 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
36c30 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
36c40 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
36c50 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
36c60 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
36c70 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
36c80 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
36c90 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
36ca0 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
36cb0 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68  citly calling th
36cc0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
36cd0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
36ce0 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
36cf0 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
36d00 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
36d10 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
36d20 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
36d30 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
36d40 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
36d50 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
36d60 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
36d70 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
36d80 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
36d90 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
36da0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
36db0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
36dc0 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
36dd0 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
36de0 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
36df0 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
36e00 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
36e10 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
36e20 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
36e30 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
36e40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
36e50 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
36e60 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
36e70 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
36e80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
36e90 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
36ea0 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
36eb0 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
36ec0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
36ed0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
36ee0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
36ef0 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
36f00 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
36f10 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
36f20 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
36f30 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
36f40 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
36f50 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
36f60 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
36f70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
36f80 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
36f90 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
36fa0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
36fb0 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
36fc0 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
36fd0 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
36fe0 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20 20 20  int nFails;     
36ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37000 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68 20  Number of conch 
37010 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65 73 20  taking failures 
37020 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
37030 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
37040 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
37050 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
37060 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
37070 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
37080 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
37090 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
370a0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
370b0 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
370c0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
370d0 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
370e0 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
370f0 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
37100 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
37110 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
37120 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
37130 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
37140 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
37150 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
37160 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
37170 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
37180 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
37190 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
371a0 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
371b0 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
371c0 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
371d0 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
371e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
371f0 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
37200 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
37210 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
37220 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
37230 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
37240 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
37250 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
37260 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
37270 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
37280 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
37290 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
372a0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
372b0 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
372c0 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
372d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
372e0 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73  lPath, errno, os
372f0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20  Getpid(0)));.   
37300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37310 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
37320 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
37330 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
37340 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
37350 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
37360 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
37370 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
37380 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
37390 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
373a0 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
373b0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
373c0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
373d0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
373e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
373f0 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
37400 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
37410 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
37420 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
37430 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
37440 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
37450 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
37460 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
37470 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
37480 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
37490 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
374a0 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
374b0 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
374c0 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
374d0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
374e0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
374f0 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
37500 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
37510 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
37520 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  th, osGetpid(0))
37530 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
37540 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a  TE_OK;.}../* . *
37550 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f  * Creates the lo
37560 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20  ck file and any 
37570 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72  missing director
37580 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a  ies in lockPath.
37590 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
375a0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
375b0 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  th(const char *l
375c0 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20  ockPath){.  int 
375d0 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62  i, len;.  char b
375e0 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  uf[MAXPATHLEN];.
375f0 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b    int start = 0;
37600 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63  .  .  assert(loc
37610 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20  kPath!=NULL);.  
37620 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  /* try to create
37630 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65   all the interme
37640 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65  diate directorie
37650 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e  s */.  len = (in
37660 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74  t)strlen(lockPat
37670 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c  h);.  buf[0] = l
37680 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f  ockPath[0];.  fo
37690 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69  r( i=1; i<len; i
376a0 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  ++ ){.    if( lo
376b0 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27  ckPath[i] == '/'
376c0 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e   && (i - start >
376d0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
376e0 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65  only mkdir if le
376f0 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72  af dir != "." or
37700 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a   "/" or ".." */.
37710 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72        if( i-star
37720 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d  t>2 || (i-start=
37730 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =1 && buf[start]
37740 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
37750 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20  tart] != '/') . 
37760 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74          || (i-st
37770 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74  art==2 && buf[st
37780 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
37790 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27  uf[start+1] != '
377a0 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  .') ){.        b
377b0 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20  uf[i]='\0';.    
377c0 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28      if( osMkdir(
377d0 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  buf, SQLITE_DEFA
377e0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
377f0 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20  MISSIONS) ){.   
37800 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
37810 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
37820 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
37830 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
37840 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
37850 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44  LOCKPATH  FAILED
37860 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a   creating %s, ".
37870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37880 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79       "'%s' proxy
37890 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
378a0 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
378b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
378c0 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29  f, strerror(err)
378d0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65  , lockPath, osGe
378e0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20  tpid(0)));.     
378f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
37900 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
37910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37920 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
37930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
37940 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
37950 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
37960 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
37970 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
37980 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 6c  h=%s pid=%d\n",l
37990 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74 70 69 64  ockPath,osGetpid
379a0 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
379b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
379c0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
379d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
379e0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
379f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
37a00 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
37a10 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
37a20 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
37a30 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
37a40 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
37a50 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
37a60 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
37a70 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
37a80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
37a90 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
37aa0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
37ab0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
37ac0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
37ad0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
37ae0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
37af0 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
37b00 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
37b10 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
37b20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
37b30 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
37b40 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
37b50 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
37b60 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
37b70 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
37b80 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
37b90 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
37ba0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
37bb0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
37bc0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
37bd0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
37be0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
37bf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37c00 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
37c10 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
37c20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
37c30 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
37c40 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
37c50 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
37c60 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
37c70 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
37c80 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
37c90 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
37ca0 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
37cb0 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
37cc0 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
37cd0 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
37ce0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
37cf0 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
37d00 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
37d10 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
37d20 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
37d30 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
37d40 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
37d50 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
37d60 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
37d70 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
37d80 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
37d90 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
37da0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
37db0 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
37dc0 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
37dd0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
37de0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
37df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
37e00 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
37e10 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
37e20 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
37e30 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
37e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37e50 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
37e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
37e70 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
37e80 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
37e90 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
37ea0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
37eb0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
37ec0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
37ed0 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
37ee0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
37ef0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
37f00 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
37f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37f20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
37f30 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
37f40 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
37f50 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
37f60 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
37f70 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
37f80 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
37f90 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
37fa0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
37fb0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
37fc0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
37fd0 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
37fe0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
37ff0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
38000 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
38010 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
38020 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
38030 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
38040 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
38050 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
38060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
38070 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
38080 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
38090 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
380a0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
380b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
380c0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
380d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
380e0 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
380f0 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
38100 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a  alloc64(sizeof(*
38110 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
38120 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
38130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
38140 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
38150 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78   end_create_prox
38160 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  y;.  }.  memset(
38170 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
38180 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e  unixFile));.  pN
38190 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  ew->openFlags = 
381a0 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d  openFlags;.  mem
381b0 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30  set(&dummyVfs, 0
381c0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66  , sizeof(dummyVf
381d0 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  s));.  dummyVfs.
381e0 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64  pAppData = (void
381f0 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
38200 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e  der;.  dummyVfs.
38210 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b  zName = "dummy";
38220 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  .  pUnused->fd =
38230 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e   fd;.  pUnused->
38240 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  flags = openFlag
38250 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 65 61  s;.  pNew->pPrea
38260 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d  llocatedUnused =
38270 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72   pUnused;.  .  r
38280 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
38290 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64  le(&dummyVfs, fd
382a0 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  , (sqlite3_file*
382b0 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b  )pNew, path, 0);
382c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
382d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46  E_OK ){.    *ppF
382e0 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ile = pNew;.    
382f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
38300 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65  ;.  }.end_create
38310 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f  _proxy:    .  ro
38320 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
38330 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
38340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
38350 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  New);.  sqlite3_
38360 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20  free(pUnused);. 
38370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
38380 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
38390 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75  T./* simulate mu
383a0 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
383b0 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
383c0 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
383d0 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s */.int sqlite3
383e0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b  _hostid_num = 0;
383f0 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
38400 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
38410 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68      16  /* conch
38420 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65   file host id le
38430 6e 67 74 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ngth */..#ifdef 
38440 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44  HAVE_GETHOSTUUID
38450 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
38460 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
38470 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
38480 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
38490 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
384a0 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
384b0 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
384c0 65 63 20 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69  ec *wait);.#endi
384d0 66 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f  f../* get the ho
384e0 73 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73  st ID via gethos
384f0 74 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44  tuuid(), pHostID
38500 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50   must point to P
38510 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a  ROXY_HOSTIDLEN .
38520 2a 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74  ** bytes of writ
38530 61 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  able memory..*/.
38540 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
38550 47 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e  GetHostID(unsign
38560 65 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44  ed char *pHostID
38570 2c 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a  , int *pError){.
38580 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
38590 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
385a0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t)