/ Hex Artifact Content
Login

Artifact be66c31337361a72227638d6f41c7f2031739642:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1e40: 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
1e50: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1e80: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1e90: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1ea0: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1eb0: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1ec0: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1ed0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e  teristics */.#en
1ee0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ef0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f00: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f30: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1f40: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1f50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f70: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1f80: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f90: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1fc0: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1fd0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fe0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
2000: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2010: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
2020: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2030: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2040: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2050: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2060: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2070: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2080: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
20a0: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
20b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
20c0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20d0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20e0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2100: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2110: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2120: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2130: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2140: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2150: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2160: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2170: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2180: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2190: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
21a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
21b0: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
21c0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21e0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21f0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2200: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2210: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2220: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2230: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2240: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2250: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2260: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2270: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2280: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2290: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
22a0: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
22b0: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  on */.#endif.#if
22c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22d0: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
22e0: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
22f0: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2300: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
2310: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
2320: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2330: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
2340: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
2350: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2360: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2370: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2380: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2390: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
23a0: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
23b0: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
23c0: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
23d0: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
23e0: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
23f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2400: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
2410: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
2420: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
2430: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
2440: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
2450: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
2460: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2470: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2480: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2490: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
24a0: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
24b0: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
24c0: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
24d0: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
24e0: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  0.#endif.#define
2520: 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20   UNIXFILE_PSOW  
2530: 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f        0x10     /
2540: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
2550: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2560: 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  TE */.#define UN
2570: 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20  IXFILE_DELETE   
2580: 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44     0x20     /* D
2590: 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  elete on close *
25a0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
25b0: 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30  LE_URI         0
25c0: 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e  x40     /* Filen
25d0: 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71  ame might have q
25e0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
25f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2600: 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20  ILE_NOLOCK      
2610: 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e  0x80     /* Do n
2620: 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  o file locking *
2630: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
2640: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
2650: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
2660: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
2670: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
2680: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
2690: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
26a0: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
26b0: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
26c0: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
26d0: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
26e0: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
26f0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
2700: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2710: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2720: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2730: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2740: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
2750: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
2760: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
2770: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
2780: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
2790: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
27a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
27b0: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
27c0: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
27d0: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
27e0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
27f0: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2800: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2810: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2820: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
2830: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
2840: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
2850: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
2860: 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ./*.** Different
2870: 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65   Unix systems de
2880: 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20  clare open() in 
2890: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20  different ways. 
28a0: 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65   Same use.** ope
28b0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
28c0: 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65  t,mode_t).  Othe
28d0: 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73  rs use open(cons
28e0: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29  t char*,int,...)
28f0: 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
2900: 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  nce is important
2910: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f   when using a po
2920: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
2930: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
2940: 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64   safest way to d
2950: 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f  eal with the pro
2960: 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79  blem is to alway
2970: 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70  s use this wrapp
2980: 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61  er.** which alwa
2990: 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ys has the same 
29a0: 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74  well-defined int
29b0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
29c0: 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28  c int posixOpen(
29d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
29e0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
29f0: 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  t mode){.  retur
2a00: 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c  n open(zFile, fl
2a10: 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f  ags, mode);.}../
2a20: 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73  *.** On some sys
2a30: 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66  tems, calls to f
2a40: 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69  chown() will tri
2a50: 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20 69  gger a message i
2a60: 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20  n a security.** 
2a70: 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65  log if they come
2a80: 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70   from non-root p
2a90: 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76  rocesses.  So av
2aa0: 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f  oid calling fcho
2ab0: 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72  wn() if.** we ar
2ac0: 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73  e not running as
2ad0: 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   root..*/.static
2ae0: 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f 77 6e   int posixFchown
2af0: 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75  (int fd, uid_t u
2b00: 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a  id, gid_t gid){.
2b10: 20 20 72 65 74 75 72 6e 20 67 65 74 65 75 69 64    return geteuid
2b20: 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77 6e 28  () ? 0 : fchown(
2b30: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a  fd,uid,gid);.}..
2b40: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
2b50: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
2b60: 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
2b70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e  (const char*, in
2b80: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  t*);../*.** Many
2b90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2ba0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2bb0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2bc0: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2bd0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2be0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2bf0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2c00: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2c10: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2c20: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2c30: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2c40: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2c50: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2c60: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2c70: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2c80: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2c90: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2ca0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2cd0: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 74 65 6d  ame of the sytem
2ce0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
2cf0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
2d00: 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72  Current; /* Curr
2d10: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
2d20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
2d30: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
2d40: 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20  l_ptr pDefault; 
2d50: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
2d60: 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d   */.} aSyscall[]
2d70: 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c   = {.  { "open",
2d80: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2d90: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
2da0: 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a  sixOpen,  0  },.
2db0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20  #define osOpen  
2dc0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
2dd0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74  st char*,int,int
2de0: 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43  ))aSyscall[0].pC
2df0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c  urrent)..  { "cl
2e00: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ose",        (sq
2e10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2e20: 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30 20  r)close,      0 
2e30: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c   },.#define osCl
2e40: 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a 29  ose     ((int(*)
2e50: 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  (int))aSyscall[1
2e60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2e70: 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20 20   "access",      
2e80: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2e90: 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20 20  l_ptr)access,   
2ea0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2eb0: 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69 6e  osAccess    ((in
2ec0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
2ed0: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ,int))aSyscall[2
2ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
2ef0: 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20 20   "getcwd",      
2f00: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
2f10: 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20 20  l_ptr)getcwd,   
2f20: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
2f30: 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63 68  osGetcwd    ((ch
2f40: 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a  ar*(*)(char*,siz
2f50: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  e_t))aSyscall[3]
2f60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2f70: 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  "stat",         
2f80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2f90: 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20 20  _ptr)stat,      
2fa0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2fb0: 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e 74  sStat      ((int
2fc0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2fd0: 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53  struct stat*))aS
2fe0: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
2ff0: 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  nt)../*.** The D
3000: 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e  JGPP compiler en
3010: 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20  vironment looks 
3020: 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78  mostly like Unix
3030: 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b  , but it.** lack
3040: 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79  s the fcntl() sy
3050: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72  stem call.  So r
3060: 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20  edefine fcntl() 
3070: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a  to be something.
3080: 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73  ** that always s
3090: 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d  ucceeds.  This m
30a0: 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e  eans that lockin
30b0: 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  g does not occur
30c0: 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e   under.** DJGPP.
30d0: 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53 20    But it is DOS 
30e0: 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20 65  - what did you e
30f0: 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66  xpect?.*/.#ifdef
3100: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22   __DJGPP__.  { "
3110: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 30  fstat",        0
3120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3130: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3140: 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20 20  osFstat(a,b,c)  
3150: 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a 20    0.#else     . 
3160: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
3170: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3180: 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20 20  all_ptr)fstat,  
3190: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
31a0: 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28 28  e osFstat     ((
31b0: 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75 63  int(*)(int,struc
31c0: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
31d0: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[5].pCurrent).#
31e0: 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72 75  endif..  { "ftru
31f0: 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ncate",    (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20 7d  ftruncate,  0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72 75  ,.#define osFtru
3230: 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ncate ((int(*)(i
3240: 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61  nt,off_t))aSysca
3250: 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[6].pCurrent).
3260: 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20  .  { "fcntl",   
3270: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3280: 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c  scall_ptr)fcntl,
3290: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
32a0: 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20 20  ine osFcntl     
32b0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74  ((int(*)(int,int
32c0: 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37  ,...))aSyscall[7
32d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
32e0: 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20 20   "read",        
32f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3300: 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20 20  l_ptr)read,     
3310: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3320: 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73 73  osRead      ((ss
3330: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
3340: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
3350: 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29  all[8].pCurrent)
3360: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
3370: 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49  E_PREAD) || SQLI
3380: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
3390: 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72 65  G_STYLE.  { "pre
33a0: 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ad",        (sql
33b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33c0: 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20 20  )pread,      0  
33d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
33e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
33f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3400: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
3410: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
3420: 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20 28  ne osPread     (
3430: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3440: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
3450: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  _t))aSyscall[9].
3460: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3470: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3480: 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36 34  64).  { "pread64
3490: 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ",      (sqlite3
34a0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
34b0: 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23  ad64,    0  },.#
34c0: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 36  else.  { "pread6
34d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
34e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
34f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3500: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3510: 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73 69  sPread64   ((ssi
3520: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3530: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
3540: 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75  aSyscall[10].pCu
3550: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69  rrent)..  { "wri
3560: 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  te",        (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20 20  )write,      0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  },.#define osWri
35a0: 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74  te     ((ssize_t
35b0: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
35c0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
35d0: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
35e0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
35f0: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
3600: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
3610: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
3620: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73  write",       (s
3630: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3640: 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20 30  tr)pwrite,     0
3650: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
3660: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3670: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3680: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3690: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
36a0: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20  fine osPwrite   
36b0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
36c0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
36d0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70    aSyscall[12].p
3700: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3710: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
3720: 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34  4).  { "pwrite64
3730: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
3740: 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69  syscall_ptr)pwri
3750: 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65  te64,   0  },.#e
3760: 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36  lse.  { "pwrite6
3770: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3780: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3790: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
37a0: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
37b0: 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69 7a  Pwrite64  ((ssiz
37c0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
37d0: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66   void*,size_t,of
37e0: 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20  f_t))\.         
37f0: 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63             aSysc
3800: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
3810: 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c  )..  { "fchmod",
3820: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3830: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d  syscall_ptr)fchm
3840: 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  od,     0  },.#d
3850: 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20  efine osFchmod  
3860: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d    ((int(*)(int,m
3870: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3880: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
3890: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
38a0: 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
38b0: 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
38c0: 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61  ALLOCATE.  { "fa
38d0: 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71  llocate",    (sq
38e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
38f0: 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  r)posix_fallocat
3900: 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  e,  0 },.#else. 
3910: 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20   { "fallocate", 
3920: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3930: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3940: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3950: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
3960: 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28  Fallocate ((int(
3970: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66  *)(int,off_t,off
3980: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  _t))aSyscall[15]
3990: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
39a0: 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20  "unlink",       
39b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
39c0: 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20  _ptr)unlink,    
39d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
39e0: 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20  ine osUnlink    
39f0: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
3a00: 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  har*))aSyscall[1
3a10: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3a20: 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  { "openDirectory
3a30: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3a40: 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44  yscall_ptr)openD
3a50: 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30  irectory,      0
3a60: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
3a70: 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e  enDirectory ((in
3a80: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3a90: 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  ,int*))aSyscall[
3aa0: 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  17].pCurrent).. 
3ab0: 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20   { "mkdir",     
3ac0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ad0: 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20  all_ptr)mkdir,  
3ae0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3af0: 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20  efine osMkdir   
3b00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3b10: 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61   char*,mode_t))a
3b20: 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72  Syscall[18].pCur
3b30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69  rent)..  { "rmdi
3b40: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
3b50: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3b60: 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  rmdir,          
3b70: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3b80: 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Rmdir     ((int(
3b90: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  *)(const char*))
3ba0: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
3bb0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68  rrent)..  { "fch
3bc0: 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c  own",       (sql
3bd0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3be0: 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20 20  )posixFchown,   
3bf0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3c00: 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74  sFchown    ((int
3c10: 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69  (*)(int,uid_t,gi
3c20: 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30  d_t))aSyscall[20
3c30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20  ].pCurrent)..}; 
3c40: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3c50: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3c60: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a  m calls */../*.*
3c70: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
3c80: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
3c90: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
3ca0: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
3cb0: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
3cc0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
3cd0: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
3ce0: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
3cf0: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
3d00: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
3d10: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
3d20: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
3d30: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
3d40: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
3d50: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
3d60: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
3d70: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
3d80: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
3d90: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
3da0: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
3db0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
3dc0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3de0: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
3df0: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
3e00: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3e10: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
3e20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
3e30: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
3e40: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
3e50: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
3e60: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
3e70: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
3e80: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
3e90: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
3ea0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
3eb0: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
3ec0: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
3ed0: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
3ee0: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
3ef0: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
3f00: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3f10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
3f20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
3f30: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
3f40: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
3f50: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
3f60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
3f70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
3f80: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
3f90: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
3fa0: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
3fb0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
3fc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
3fd0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
3fe0: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
3ff0: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
4000: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
4010: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
4020: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
4030: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4040: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4050: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4060: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4070: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4080: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4090: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
40a0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
40b0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
40c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
40d0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
40e0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
40f0: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
4100: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
4110: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4120: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
4130: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
4140: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4150: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
4160: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4170: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
4180: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
41a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
41b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
41c0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
41d0: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
41e0: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
41f0: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
4200: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
4210: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
4220: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
4230: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
4240: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
4250: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
4260: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
4270: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
4280: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
4290: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
42a0: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
42b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
42c0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
42d0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
42e0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
42f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4300: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4310: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4320: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
4330: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4340: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4350: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
4360: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4370: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
4380: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
4390: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
43a0: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
43b0: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
43c0: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
43d0: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
43e0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
43f0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
4400: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
4410: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
4420: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
4430: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
4440: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
4450: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
4460: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
4470: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4480: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
4490: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
44a0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
44b0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
44c0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
44d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
44e0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
44f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
4500: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
4510: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
4520: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4530: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4540: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4550: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4560: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
4570: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
4580: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
4590: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
45a0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
45b0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
45c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
45d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
45e0: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
45f0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
4600: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
4610: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
4620: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
4630: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
4640: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
4650: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
4660: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
4670: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
4680: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
4690: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
46a0: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
46b0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
46c0: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
46d0: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
46e0: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
46f0: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
4700: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
4710: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
4720: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
4730: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
4740: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
4750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
4760: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
4770: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
4780: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
4790: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
47a0: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
47b0: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
47c0: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
47d0: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
47e0: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
47f0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
4800: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
4810: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
4820: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
4830: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
4840: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
4850: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
4860: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
4870: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
4880: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
4890: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
48a0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
48b0: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
48c0: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
48d0: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
48e0: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
48f0: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
4900: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
4910: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
4920: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
4930: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
4940: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
4950: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
4960: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
4970: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4980: 49 53 53 49 4f 4e 53 3b 0a 20 20 64 6f 7b 0a 23  ISSIONS;.  do{.#
4990: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
49a0: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
49b0: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
49c0: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
49d0: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
49e0: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
49f0: 20 7d 77 68 69 6c 65 28 20 66 64 3c 30 20 26 26   }while( fd<0 &&
4a00: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
4a10: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
4a20: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
4a30: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
4a40: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
4a50: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
4a60: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
4a70: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
4a80: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
4a90: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
4aa0: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
4ab0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
4ac0: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
4ad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4ae0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
4af0: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
4b00: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
4b10: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
4b20: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
4b30: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
4b40: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
4b50: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
4b60: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4b70: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
4b80: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
4b90: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
4ba0: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
4bb0: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
4bc0: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
4bd0: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
4be0: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
4bf0: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
4c00: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
4c10: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
4c20: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
4c30: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
4c40: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
4c50: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
4c60: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
4c70: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
4c80: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
4c90: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
4ca0: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
4cb0: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
4cc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4cd0: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
4ce0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
4cf0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
4d00: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
4d10: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
4d20: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
4d30: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
4d40: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
4d50: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
4d60: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
4d70: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
4d80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
4d90: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
4da0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
4db0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
4dc0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
4dd0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
4de0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
4df0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
4e00: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
4e10: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
4e20: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
4e30: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4e40: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
4e50: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
4e60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
4e80: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
4e90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4ea0: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
4eb0: 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69  endif...#if defi
4ec0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
4ed0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4ee0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
4ef0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
4f00: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
4f10: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
4f20: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
4f30: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
4f40: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
4f50: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
4f60: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
4f70: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
4f80: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
4f90: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4fa0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
4fb0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
4fc0: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
4fd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
4fe0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
4ff0: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
5000: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5010: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
5020: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5030: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5040: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
5050: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
5060: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
5070: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
5080: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
5090: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
50a0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
50b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
50c0: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
50d0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
50e0: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
50f0: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
5100: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
5110: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5120: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
5130: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
5140: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
5150: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
5160: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
5170: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
5180: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
5190: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
51a0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
51b0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
51c0: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
51d0: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
51e0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
51f0: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
5200: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
5210: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
5220: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
5230: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
5240: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
5250: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
5260: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
5270: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
5280: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
5290: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
52a0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
52b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
52c0: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
52d0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
52e0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
52f0: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
5300: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
5310: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
5320: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
5330: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
5340: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
5350: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
5360: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
5370: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
5380: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
5390: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
53a0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
53b0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
53c0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
53d0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
53e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
53f0: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
5400: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
5410: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5420: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
5430: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
5440: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
5450: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
5460: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
5470: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
5480: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
5490: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
54a0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
54b0: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
54c0: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
54d0: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
54e0: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
54f0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
5500: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
5510: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
5520: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
5530: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
5540: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
5550: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
5560: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
5570: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
5580: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
5590: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
55a0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
55b0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
55c0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
55d0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
55e0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
55f0: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
5600: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5610: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5620: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5630: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5640: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
5650: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
5660: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
5670: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
5680: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
5690: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
56a0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
56b0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
56c0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
56d0: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
56e0: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
56f0: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
5700: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
5710: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
5720: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
5730: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
5740: 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73 74 61 74 69  o EINTR.*/.stati
5750: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72  c int robust_ftr
5760: 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71  uncate(int h, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b  lite3_int64 sz){
5780: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
5790: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
57a0: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
57b0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
57c0: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
57d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
57e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
57f0: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
5800: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
5810: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
5820: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
5830: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
5840: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
5850: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
5860: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
5870: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
5880: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
5890: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
58a0: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
58b0: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
58c0: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
58d0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
58e0: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
58f0: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
5900: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
5910: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
5920: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
5930: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
5940: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
5950: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
5960: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
5970: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
5980: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
5990: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
59a0: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
59b0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
59c0: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
59d0: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
59e0: 20 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45    switch (posixE
59f0: 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a 20 20  rror) {.#if 0.  
5a00: 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
5a10: 74 68 69 73 20 63 6f 64 65 20 77 61 73 20 6e 6f  this code was no
5a20: 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 2e  t commented out.
5a30: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 69 73   In theory, this
5a40: 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73 68 6f   branch.  ** sho
5a50: 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68 69 74  uld never be hit
5a60: 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  , as this functi
5a70: 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  on should only b
5a80: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 0a 20  e called after. 
5a90: 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d 72 65   ** a locking-re
5aa0: 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 28  lated function (
5ab0: 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20 68 61  i.e. fcntl()) ha
5ac0: 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a  s returned non-z
5ad0: 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ero with.  ** th
5ae0: 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f  e value of errno
5af0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5b00: 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20 61 20  gument. Since a 
5b10: 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61 73 20  system call has 
5b20: 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65 72 72  failed,.  ** err
5b30: 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 6e  no should be non
5b40: 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -zero..  **.  **
5b50: 20 44 65 73 70 69 74 65 20 74 68 69 73 2c 20 69   Despite this, i
5b60: 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79 20 69  f errno really i
5b70: 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69 6c 6c  s zero, we still
5b80: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
5b90: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
5ba0: 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74 65 6d  E_OK. The system
5bb0: 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20 61 6e   call failed, an
5bc0: 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74 65 20  d *some* SQLite 
5bd0: 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62 65 0a  error should be.
5be0: 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65 64 20    ** propagated 
5bf0: 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61 6c 6c  back to the call
5c00: 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67 20 74  er. Commenting t
5c10: 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74 20 6d  his branch out m
5c20: 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a 20 20  eans errno==0.  
5c30: 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c  ** will be handl
5c40: 65 64 20 62 79 20 74 68 65 20 22 64 65 66 61 75  ed by the "defau
5c50: 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f 77 2e  lt:" case below.
5c60: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30 3a 20  .  */.  case 0: 
5c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5c80: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
5c90: 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20   case EAGAIN:.  
5ca0: 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a  case ETIMEDOUT:.
5cb0: 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20    case EBUSY:.  
5cc0: 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61  case EINTR:.  ca
5cd0: 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20  se ENOLCK:  .   
5ce0: 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72   /* random NFS r
5cf0: 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65  etry error, unle
5d00: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
5d10: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
5d20: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
5d30: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
5d40: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
5d50: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
5d60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5d70: 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63  E_BUSY;.    .  c
5d80: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 20  ase EACCES: .   
5d90: 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20 6c 69   /* EACCES is li
5da0: 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69 6e 67  ke EAGAIN during
5db0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
5dc0: 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  ons, but not any
5dd0: 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a 20 20   other time*/.  
5de0: 20 20 69 66 28 20 28 73 71 6c 69 74 65 49 4f 45    if( (sqliteIOE
5df0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
5e00: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
5e10: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
5e20: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
5e30: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
5e40: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
5e50: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
5e60: 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20  RR_RDLOCK) ||.  
5e70: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
5e80: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
5e90: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
5ea0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
5eb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
5ec0: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  Y;.    }.    /* 
5ed0: 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67  else fall throug
5ee0: 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45 52  h */.  case EPER
5ef0: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
5f00: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
5f10: 0a 20 20 2f 2a 20 45 44 45 41 44 4c 4b 20 69 73  .  /* EDEADLK is
5f20: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
5f30: 66 20 61 20 63 61 6c 6c 20 74 6f 20 66 63 6e 74  f a call to fcnt
5f40: 6c 28 46 5f 53 45 54 4c 4b 57 29 20 69 73 20 6d  l(F_SETLKW) is m
5f50: 61 64 65 2e 20 41 6e 64 0a 20 20 2a 2a 20 74 68  ade. And.  ** th
5f60: 69 73 20 6d 6f 64 75 6c 65 20 6e 65 76 65 72 20  is module never 
5f70: 6d 61 6b 65 73 20 73 75 63 68 20 61 20 63 61 6c  makes such a cal
5f80: 6c 2e 20 41 6e 64 20 74 68 65 20 63 6f 64 65 20  l. And the code 
5f90: 69 6e 20 53 51 4c 69 74 65 20 69 74 73 65 6c 66  in SQLite itself
5fa0: 20 0a 20 20 2a 2a 20 61 73 73 65 72 74 73 20 74   .  ** asserts t
5fb0: 68 61 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  hat SQLITE_IOERR
5fc0: 5f 42 4c 4f 43 4b 45 44 20 69 73 20 6e 65 76 65  _BLOCKED is neve
5fd0: 72 20 72 65 74 75 72 6e 65 64 2e 20 46 6f 72 20  r returned. For 
5fe0: 74 68 65 73 65 20 72 65 61 73 6f 6e 73 0a 20 20  these reasons.  
5ff0: 2a 2a 20 74 68 69 73 20 63 61 73 65 20 69 73 20  ** this case is 
6000: 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
6010: 75 74 2e 20 49 66 20 74 68 65 20 73 79 73 74 65  ut. If the syste
6020: 6d 20 64 6f 65 73 20 73 65 74 20 65 72 72 6e 6f  m does set errno
6030: 20 74 6f 20 45 44 45 41 44 4c 4b 2c 0a 20 20 2a   to EDEADLK,.  *
6040: 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 53 51  * the default SQ
6050: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 63  LITE_IOERR_XXX c
6060: 6f 64 65 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ode will be retu
6070: 72 6e 65 64 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  rned. */.#if 0. 
6080: 20 63 61 73 65 20 45 44 45 41 44 4c 4b 3a 0a 20   case EDEADLK:. 
6090: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
60a0: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
60b0: 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 20  #endif.    .#if 
60c0: 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54  EOPNOTSUPP!=ENOT
60d0: 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f  SUP.  case EOPNO
60e0: 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73  TSUPP: .    /* s
60f0: 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65  omething went te
6100: 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c  rribly awry, unl
6110: 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20  ess during file 
6120: 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a  system support .
6130: 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63       * introspec
6140: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69  tion, in which i
6150: 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73  t actually means
6160: 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f   what it says */
6170: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45  .#endif.#ifdef E
6180: 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e  NOTSUP.  case EN
6190: 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69  OTSUP: .    /* i
61a0: 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73  nvalid fd, unles
61b0: 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79  s during file sy
61c0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74  stem support int
61d0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
61e0: 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20  hich .     * it 
61f0: 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77  actually means w
6200: 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23  hat it says */.#
6210: 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f  endif.  case EIO
6220: 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a  :.  case EBADF:.
6230: 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20    case EINVAL:. 
6240: 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a   case ENOTCONN:.
6250: 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20    case ENODEV:. 
6260: 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63   case ENXIO:.  c
6270: 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66 64  ase ENOENT:.#ifd
6280: 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20 20  ef ESTALE       
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
62a0: 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20 64   ESTALE is not d
62b0: 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72 69  efined on Interi
62c0: 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 63  x systems */.  c
62d0: 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e 64  ase ESTALE:.#end
62e0: 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59 53  if.  case ENOSYS
62f0: 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20 73  :.    /* these s
6300: 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65 20  hould force the 
6310: 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65 20  client to close 
6320: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 63  the file and rec
6330: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a 20  onnect */.    . 
6340: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
6350: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
6360: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 2a 2a  r;.  }.}..../***
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
63c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
63d0: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
63e0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
63f0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
6400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
6410: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
6420: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
6430: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
6440: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
6450: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
6460: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
6470: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
6480: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
6490: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
64a0: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
64b0: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
64c0: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
64d0: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
64e0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
64f0: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
6500: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
6510: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
6520: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6530: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
6540: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
6550: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
6560: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
6570: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
6580: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
6590: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
65a0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
65b0: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
65c0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
65d0: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
65e0: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
65f0: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
6600: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
6610: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
6620: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
6630: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
6640: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
6650: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
6660: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
6670: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
6680: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
6690: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
66a0: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
66b0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
66c0: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
66d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
66e0: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
66f0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6700: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
6710: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
6720: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
6730: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
6740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6750: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
6760: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
6770: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6790: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
67a0: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
67b0: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
67c0: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
67d0: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
67e0: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
67f0: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
6800: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
6810: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
6820: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
6830: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6840: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
6850: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
6860: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6870: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6880: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
6890: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
68a0: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
68b0: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
68c0: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
68d0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
68e0: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
68f0: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
6900: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
6910: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
6920: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
6930: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
6940: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
6950: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
6960: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
6970: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
6980: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
6990: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
69a0: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
69b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
69c0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
69d0: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
69e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
69f0: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
6a00: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
6a10: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
6a20: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
6a30: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
6a40: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
6a50: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
6a60: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
6a70: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
6a80: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
6a90: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
6aa0: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
6ab0: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
6ac0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6ad0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
6ae0: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
6af0: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
6b00: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
6b10: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6b30: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
6b40: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
6b50: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
6b60: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
6b70: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
6b80: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
6b90: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
6ba0: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
6bb0: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
6bc0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6be0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
6bf0: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
6c00: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
6c10: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
6c20: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
6c30: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
6c40: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
6c50: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
6c60: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
6c70: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
6c80: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
6c90: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
6ca0: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
6cb0: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
6cc0: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
6cd0: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
6ce0: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
6cf0: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
6d00: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
6d10: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6d20: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
6d30: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
6d40: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
6d50: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
6d60: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
6d70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
6d80: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
6d90: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
6da0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6db0: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
6dc0: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
6dd0: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
6de0: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
6df0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
6e00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
6e10: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
6e20: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
6e30: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6e40: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
6e50: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
6e60: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
6e70: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
6e80: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
6eb0: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
6ec0: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
6ed0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
6ee0: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28  =='/' );.  n = (
6ef0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f  int)strlen(zAbso
6f00: 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  luteName);.  pNe
6f10: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
6f20: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
6f30: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
6f40: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
6f50: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
6f60: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
6f70: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
6f80: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
6f90: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
6fa0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
6fb0: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
6fc0: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
6fd0: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
6fe0: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
6ff0: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
7000: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
7010: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
7020: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
7030: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
7040: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7050: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
7060: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7070: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
7080: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
7090: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
70a0: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
70b0: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
70c0: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
70d0: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
70e0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
70f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
7100: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
7110: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
7120: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
7130: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
7140: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7150: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
7160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
7170: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
7180: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
7190: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
71a0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
71b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
71c0: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
71d0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
71e0: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
71f0: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
7200: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
7210: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
7220: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
7230: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
7240: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
7250: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
7260: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
7270: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7280: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7290: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
72a0: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
72b0: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
72c0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
72d0: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
72e0: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
72f0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
7300: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
7310: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
7320: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
7330: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
7340: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
7350: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7360: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
7370: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
7380: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
7390: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
73a0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
73b0: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
73c0: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
73d0: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
73e0: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
73f0: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
7400: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
7410: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
7420: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
7430: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7440: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
7450: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7460: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
7470: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
7480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
7490: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
74a0: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
74b0: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
7590: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
75a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
75c0: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
75d0: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
75e0: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
75f0: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
7600: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
7610: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
7620: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
7630: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
7640: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
7650: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
7660: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
7670: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
7680: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
7690: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
76a0: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
76b0: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
76c0: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
76d0: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
76e0: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
76f0: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
7700: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
7710: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
7720: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7730: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
7740: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
7750: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
7760: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
7770: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
7780: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
7790: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
77a0: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
77b0: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
77c0: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
77d0: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
77e0: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
77f0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
7800: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
7810: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
7820: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
7830: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
7840: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
7850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
7860: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
7870: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
7880: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
7890: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
78a0: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
78b0: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
78c0: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
78d0: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
78e0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
78f0: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
7900: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
7910: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
7920: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
7930: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7940: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7950: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
7960: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
7970: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
7980: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
7990: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
79a0: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
79b0: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
79c0: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
79d0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
79e0: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
79f0: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
7a00: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
7a10: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
7a20: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
7a30: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
7a40: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
7a50: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
7a60: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
7a70: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
7a80: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
7a90: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
7aa0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
7ab0: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
7ac0: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
7ad0: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
7ae0: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
7af0: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
7b00: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
7b10: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
7b20: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
7b30: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
7b40: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
7b50: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
7b60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7b70: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
7b80: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7b90: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
7ba0: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
7bb0: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
7bc0: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
7bd0: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
7be0: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
7bf0: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
7c00: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
7c10: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
7c20: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
7c30: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
7c40: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
7c50: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
7c60: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
7c70: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
7c80: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
7c90: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
7ca0: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
7cb0: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
7cc0: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
7cd0: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
7ce0: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
7cf0: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
7d00: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
7d10: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
7d20: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
7d30: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
7d40: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
7d50: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
7d60: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
7d70: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
7d80: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
7d90: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
7da0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
7db0: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
7dc0: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
7dd0: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
7de0: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
7df0: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
7e00: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
7e10: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
7e20: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
7e30: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
7e40: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
7e50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
7e60: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
7e70: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
7e80: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
7e90: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
7ea0: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
7eb0: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
7ec0: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
7ed0: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
7ee0: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
7ef0: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
7f00: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
7f10: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
7f20: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
7f30: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
7f40: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
7f50: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
7f60: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
7f70: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
7f80: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
7f90: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
7fa0: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
7fb0: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
7fc0: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
7fd0: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
7fe0: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
7ff0: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
8000: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
8010: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
8020: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
8030: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
8040: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
8050: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
8060: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
8070: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
8080: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
8090: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
80a0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
80b0: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
80c0: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
80d0: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
80e0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
80f0: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
8100: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
8110: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
8120: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
8130: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
8140: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
8150: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
8160: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
8170: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
8180: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
8190: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
81a0: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
81b0: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
81c0: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
81d0: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
81e0: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
81f0: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
8200: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
8210: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
8220: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
8230: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
8240: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
8250: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
8260: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
8270: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
8280: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
8290: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
82a0: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
82b0: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
82c0: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
82d0: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
82e0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
82f0: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
8300: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
8310: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
8320: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
8330: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
8340: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
8350: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
8360: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
8370: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
8380: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
8390: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
83a0: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
83b0: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
83c0: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
83d0: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
83e0: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
83f0: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
8400: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
8410: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
8420: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
8430: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
8440: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
8450: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
8460: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
8470: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
8480: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
8490: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
84a0: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
84b0: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
84c0: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
84d0: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
84e0: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
84f0: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
8500: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
8510: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
8520: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
8530: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
8540: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
8550: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
8560: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
8570: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
8580: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
8590: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
85a0: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
85b0: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
85c0: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
85d0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
85e0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
85f0: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
8600: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
8610: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
8620: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
8630: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
8640: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
8650: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
8660: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
8670: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
8680: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
8690: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
86a0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
86b0: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
86c0: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
86d0: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
86e0: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
86f0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
8700: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
8710: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
8720: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
8730: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
8740: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
8750: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
8760: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
8770: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
8780: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
8790: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
87a0: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
87b0: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
87c0: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
87d0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
87e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
87f0: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
8800: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
8810: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
8820: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8830: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
8840: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
8850: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
8860: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
8870: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
8880: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
8890: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
88a0: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
88b0: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
88c0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
88d0: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
88e0: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8900: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
8910: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
8920: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
8930: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
8940: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
8950: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
8960: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
8970: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
8980: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
8990: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
89a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
89b0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
89c0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
89d0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
89e0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
89f0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
8a00: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
8a10: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
8a20: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
8a30: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
8a40: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
8a50: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
8a60: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
8a70: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
8a80: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
8a90: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
8aa0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
8ab0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
8ac0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
8ad0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
8ae0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
8af0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
8b00: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
8b10: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
8b20: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
8b30: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
8b40: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
8b50: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
8b60: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
8b70: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
8b80: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8ba0: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
8bb0: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
8bc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
8bd0: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
8be0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
8bf0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
8c00: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
8c10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
8c20: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
8c30: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
8c40: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
8c50: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
8c60: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8c80: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
8c90: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
8ca0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
8cb0: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
8cc0: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
8cd0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
8ce0: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
8cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
8d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8d20: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
8d30: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
8d40: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
8d50: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
8d60: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
8d70: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
8d80: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
8d90: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
8da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
8db0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
8dc0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
8dd0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
8de0: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
8df0: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
8e00: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
8e10: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8e20: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
8e30: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
8e40: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
8e50: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
8e60: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
8e70: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
8e80: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
8e90: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8eb0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
8ec0: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
8ed0: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
8ee0: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
8ef0: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
8f00: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
8f10: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
8f20: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
8f30: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
8f40: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
8f50: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
8f60: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
8f70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
8f80: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
8f90: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
8fa0: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
8fb0: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
8fc0: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
8fd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
8fe0: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
8ff0: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
9000: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
9010: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
9020: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
9030: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
9040: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
9050: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
9060: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
9070: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
9080: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
9090: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
90a0: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
90b0: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
90c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
90d0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
90e0: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
90f0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
9100: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
9110: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9120: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
9130: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
9140: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
9150: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
9160: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
9170: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
9180: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
9190: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
91a0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
91b0: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
91c0: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
91d0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
91e0: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
91f0: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
9200: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
9210: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
9220: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
9230: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
9240: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
9250: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
9260: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9280: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9290: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
92a0: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
92b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
92c0: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
92d0: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
92e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
92f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9300: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
9310: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
9320: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
9350: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
9360: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
9370: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
9380: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
93a0: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
93b0: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
93c0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
93d0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
93e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
93f0: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
9400: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
9410: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
9420: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
9430: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
9440: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
9450: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
9460: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
9470: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
9480: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
9490: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
94a0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
94b0: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
94c0: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
94d0: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
94e0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
94f0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
9500: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
9510: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
9520: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
9530: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
9540: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
9550: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
9560: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
9570: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
9580: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
9590: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
95a0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
95b0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
95c0: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
95d0: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
95e0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
95f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
9600: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
9610: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9620: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
9630: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
9640: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
9650: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
9660: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
9670: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
9680: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
9690: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
96a0: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
96b0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
96c0: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
96d0: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
96e0: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
96f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9700: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
9710: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
9720: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
9730: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
9740: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
9750: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
9760: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
9770: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
9780: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
9790: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
97a0: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
97b0: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
97c0: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
97d0: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
97e0: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
97f0: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
9800: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
9810: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
9820: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
9830: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
9840: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
9850: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
9860: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
9870: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
9880: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
9890: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
98a0: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
98b0: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
98c0: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
98d0: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
98e0: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
98f0: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
9900: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
9910: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
9920: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
9930: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
9940: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
9950: 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21  assert( errcode!
9960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9970: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
9980: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
9990: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
99a0: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
99b0: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
99c0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
99d0: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
99e0: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
99f0: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
9a00: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
9a10: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
9a20: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
9a30: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
9a40: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
9a50: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
9a60: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
9a70: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
9a80: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
9a90: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
9aa0: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
9ab0: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
9ac0: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
9ad0: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
9ae0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
9af0: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
9b00: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
9b10: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
9b20: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
9b30: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
9b40: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
9b50: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
9b60: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
9b70: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
9b80: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
9b90: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
9ba0: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
9bb0: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
9bc0: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
9bd0: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
9be0: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
9bf0: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
9c00: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
9c10: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
9c20: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
9c30: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
9c40: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
9c50: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
9c60: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
9c70: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
9c80: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
9c90: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
9ca0: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
9cb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
9cc0: 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69   all file descri
9cd0: 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64  ptors accumuated
9ce0: 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64   in the unixInod
9cf0: 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c  eInfo->pUnused l
9d00: 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ist..*/ .static 
9d10: 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e  void closePendin
9d20: 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  gFds(unixFile *p
9d30: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
9d40: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
9d50: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
9d60: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9d70: 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  p;.  UnixUnusedF
9d80: 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  d *pNext;.  for(
9d90: 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  p=pInode->pUnuse
9da0: 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  d; p; p=pNext){.
9db0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
9dc0: 4e 65 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74  Next;.    robust
9dd0: 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d  _close(pFile, p-
9de0: 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  >fd, __LINE__);.
9df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9e00: 28 70 29 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  (p);.  }.  pInod
9e10: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
9e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
9e30: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
9e40: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
9e50: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
9e60: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
9e70: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
9e80: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
9e90: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
9ea0: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
9eb0: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
9ec0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
9ed0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
9ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
9ef0: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
9f00: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
9f10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
9f20: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
9f30: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
9f40: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
9f50: 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  () );.  if( ALWA
9f60: 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20  YS(pInode) ){.  
9f70: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
9f80: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
9f90: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9fa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
9fb0: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
9fc0: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
9fd0: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
9fe0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
9ff0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
a000: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a010: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
a020: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a030: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
a040: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
a050: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
a070: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
a080: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a090: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
a0a0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a0b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a0c0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
a0d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a0e0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
a0f0: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
a100: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
a110: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
a120: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
a130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a140: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65  ite3_free(pInode
a150: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a160: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
a170: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
a180: 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e  ocate the unixIn
a190: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  odeInfo object t
a1a0: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
a1b0: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
a1c0: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61  iptor.  Create a
a1d0: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
a1e0: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
a1f0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68  eturn value migh
a200: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
a210: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
a220: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
a230: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
a240: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
a250: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
a260: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
a270: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
a280: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
a290: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
a2a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
a2b0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
a2c0: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65  ic int findInode
a2d0: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
a2e0: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
a2f0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
a300: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
a310: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
a320: 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ey */.  unixInod
a330: 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20  eInfo **ppInode 
a340: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
a350: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a360: 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a  fo object here *
a370: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
a3a0: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
a3b0: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
a3e0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
a3f0: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
a400: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
a410: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
a420: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
a430: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f  unixInodeInfo */
a440: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
a450: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
a460: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
a470: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
a480: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
a490: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20  fo *pInode = 0; 
a4a0: 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65      /* Candidate
a4b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a4c0: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
a4d0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
a4e0: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
a4f0: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
a500: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
a510: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
a520: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
a530: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
a540: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
a550: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
a560: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f  ile->h;.  rc = o
a570: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
a580: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
a590: 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
a5a0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
a5b0: 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  o;.#ifdef EOVERF
a5c0: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
a5d0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
a5e0: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
a5f0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
a600: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
a610: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
a620: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
a630: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
a640: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
a650: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
a660: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
a670: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
a680: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
a690: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
a6a0: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
a6b0: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
a6c0: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
a6d0: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
a6e0: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
a6f0: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
a700: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
a710: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
a720: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
a730: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
a740: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
a750: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
a760: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
a770: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
a780: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
a790: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
a7a0: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
a7b0: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
a7c0: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
a7d0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
a7e0: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
a7f0: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
a800: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
a810: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
a820: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
a830: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
a840: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
a850: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
a860: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
a870: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
a880: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
a890: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
a8a0: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
a8b0: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
a8c0: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
a8d0: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
a8e0: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
a8f0: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
a900: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
a910: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
a920: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
a930: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
a940: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
a950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a960: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
a970: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
a980: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a990: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
a9a0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
a9b0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
a9c0: 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
a9d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a9e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
a9f0: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
aa00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
aa10: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
aa20: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
aa30: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
aa40: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
aa50: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
aa60: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
aa70: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
aa80: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  no;.#endif.  pIn
aa90: 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
aaa0: 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65  .  while( pInode
aab0: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
aac0: 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  Id, &pInode->fil
aad0: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
aae0: 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  Id)) ){.    pIno
aaf0: 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
ab00: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  xt;.  }.  if( pI
ab10: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  node==0 ){.    p
ab20: 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  Inode = sqlite3_
ab30: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
ab40: 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69  pInode) );.    i
ab50: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
ab60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ab70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
ab80: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
ab90: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
aba0: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
abb0: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
abc0: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
abd0: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
abe0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20     pInode->nRef 
abf0: 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  = 1;.    pInode-
ac00: 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69  >pNext = inodeLi
ac10: 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  st;.    pInode->
ac20: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
ac30: 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69  f( inodeList ) i
ac40: 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20  nodeList->pPrev 
ac50: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e  = pInode;.    in
ac60: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
ac70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ac80: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Inode->nRef++;. 
ac90: 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20   }.  *ppInode = 
aca0: 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e  pInode;.  return
acb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
acc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
acd0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
ace0: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
acf0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
ad00: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
ad10: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
ad20: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
ad30: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
ad40: 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
ad50: 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
ad60: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
ad70: 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
ad80: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
ad90: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
ada0: 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
adb0: 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
adc0: 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
add0: 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
ade0: 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
adf0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
ae00: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
ae10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
ae20: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
ae30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ae40: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
ae50: 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
ae60: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ae70: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
ae80: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
ae90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
aea0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
aeb0: 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73  EDLOCK; );..  as
aec0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
aed0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
aee0: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
aef0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
af00: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
af10: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
af20: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
af30: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
af40: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
af50: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
af60: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
af70: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
af80: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
af90: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
afa0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
afb0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
afc0: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
afd0: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
afe0: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
aff0: 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70  ved && !pFile->p
b000: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b010: 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ock ){.    struc
b020: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b030: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b040: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b050: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
b060: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
b070: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
b080: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b090: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
b0a0: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69   if( osFcntl(pFi
b0b0: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
b0c0: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
b0d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
b0e0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b0f0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
b100: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
b110: 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
b120: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
b130: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
b140: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
b150: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
b160: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
b170: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
b180: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
b190: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
b1a0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
b1b0: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
b1c0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
b1d0: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
b1e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
b1f0: 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79  empt to set a sy
b200: 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  stem-lock on the
b210: 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68   file pFile.  Th
b220: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65  e lock is .** de
b230: 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b  scribed by pLock
b240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
b250: 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  File was opened 
b260: 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20  read/write from 
b270: 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20  unix-excl, then 
b280: 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a  the only lock.**
b290: 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69   ever obtained i
b2a0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
b2b0: 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f  ock, and it is o
b2c0: 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20  btained exactly 
b2d0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73  once.** the firs
b2e0: 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20  t time any lock 
b2f0: 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41  is attempted.  A
b300: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  ll subsequent sy
b310: 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  stem locking.** 
b320: 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d  operations becom
b330: 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69  e no-ops.  Locki
b340: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74  ng operations st
b350: 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72  ill happen inter
b360: 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64  nally,.** in ord
b370: 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  er to coordinate
b380: 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20   access between 
b390: 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73  separate databas
b3a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
b3b0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f   within this pro
b3c0: 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66  cess, but all of
b3d0: 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64   that is handled
b3e0: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74   in memory and t
b3f0: 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  he.** operating 
b400: 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
b410: 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a  participate..**.
b420: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b430: 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75   is a pass-throu
b440: 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  gh to fcntl(F_SE
b450: 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73  TLK) if pFile is
b460: 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46   using.** any VF
b470: 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e  S other than "un
b480: 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70  ix-excl" or if p
b490: 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  File is opened o
b4a0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a  n "unix-excl".**
b4b0: 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
b4c0: 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  y..**.** Zero is
b4d0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
b4e0: 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20   call completes 
b4f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72  successfully, or
b500: 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a   -1 if a call.**
b510: 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c   to fcntl() fail
b520: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
b530: 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70   errno is set ap
b540: 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20  propriately (by 
b550: 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61  fcntl())..*/.sta
b560: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
b570: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
b580: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
b590: 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e  ck *pLock){.  in
b5a0: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
b5b0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
b5c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
b5d0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
b5e0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
b5f0: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
b600: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
b610: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
b620: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
b630: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
b640: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
b650: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
b660: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
b670: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
b680: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
b690: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
b6a0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
b6b0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
b6c0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
b6d0: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
b6e0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b6f0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b700: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b710: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
b720: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
b730: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
b740: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
b750: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
b760: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
b770: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b780: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
b790: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
b7a0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
b7b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
b7c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
b7d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
b7e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
b7f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
b800: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
b810: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
b820: 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b  F_SETLK, pLock);
b830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
b850: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
b860: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
b870: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
b880: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
b890: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b8a0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
b8b0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
b8c0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
b8d0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
b8e0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
b8f0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
b900: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
b910: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
b920: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
b930: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
b940: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
b950: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
b960: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
b970: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
b980: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
b990: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
b9a0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
b9b0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
b9c0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
b9d0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
b9e0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
b9f0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
ba00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
ba10: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
ba20: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
ba30: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
ba40: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
ba50: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
ba60: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
ba70: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
ba80: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
ba90: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
baa0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
bab0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
bac0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
bad0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
bae0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
baf0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
bb00: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
bb10: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
bb20: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
bb30: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
bb40: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
bb50: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
bb60: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
bb70: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
bb80: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
bb90: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
bba0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
bbb0: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
bbc0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
bbd0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
bbe0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
bbf0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
bc00: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
bc10: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
bc20: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
bc30: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
bc40: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
bc50: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
bc60: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
bc70: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
bc80: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
bc90: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
bca0: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
bcb0: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
bcc0: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
bcd0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
bce0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
bcf0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
bd00: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
bd10: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
bd20: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
bd30: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
bd40: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
bd50: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
bd60: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
bd70: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
bd80: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
bd90: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
bda0: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
bdb0: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
bdc0: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
bdd0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
bde0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
bdf0: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
be00: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
be10: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
be20: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
be30: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
be40: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
be50: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
be60: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
be70: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
be80: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
be90: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
bea0: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
beb0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
bec0: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
bed0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
bee0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
bef0: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
bf00: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
bf10: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
bf20: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
bf30: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
bf40: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
bf50: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
bf60: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
bf70: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
bf80: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
bf90: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
bfa0: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
bfb0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
bfc0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
bfd0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
bfe0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
bff0: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
c000: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
c010: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
c020: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
c030: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
c040: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
c050: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
c060: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
c070: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
c080: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
c090: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
c0a0: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
c0b0: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
c0c0: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
c0d0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
c0e0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
c0f0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
c100: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
c110: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
c120: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
c130: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
c140: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
c150: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
c160: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
c170: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
c180: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
c190: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
c1a0: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
c1b0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
c1c0: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
c1d0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
c1e0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
c1f0: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
c200: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
c210: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
c220: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
c230: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
c240: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
c250: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
c260: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
c270: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
c280: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
c290: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
c2a0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c2b0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
c2c0: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
c2d0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
c2e0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
c2f0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
c300: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
c310: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
c320: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
c330: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
c340: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
c350: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
c360: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
c370: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
c380: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
c390: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
c3a0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
c3b0: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
c3c0: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
c3d0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
c3e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c3f0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
c400: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
c410: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
c420: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
c430: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
c440: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
c450: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
c460: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c470: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
c480: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
c490: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
c4a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
c4b0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
c4c0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
c4d0: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
c4e0: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
c4f0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
c500: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c510: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
c520: 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
c530: 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
c540: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
c550: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
c560: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
c570: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
c580: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
c590: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
c5a0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
c5b0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
c5c0: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
c5d0: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
c5e0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
c5f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
c600: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
c610: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
c620: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
c630: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
c640: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
c650: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
c660: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
c670: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
c680: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c690: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
c6a0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
c6b0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
c6c0: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
c6d0: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
c6e0: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
c6f0: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
c700: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
c710: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
c720: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
c730: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
c740: 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
c750: 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
c760: 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
c770: 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
c780: 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
c790: 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
c7a0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
c7b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
c7c0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
c7d0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c7e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
c7f0: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
c800: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
c810: 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
c820: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
c830: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
c840: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
c850: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
c860: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
c870: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
c880: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
c890: 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
c8a0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
c8b0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
c8c0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
c8d0: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
c8e0: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
c8f0: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
c900: 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
c910: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
c920: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
c930: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
c940: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
c950: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
c960: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
c970: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
c980: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
c990: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
c9a0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
c9b0: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
c9c0: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
c9d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
c9e0: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
c9f0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
ca00: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
ca10: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
ca20: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
ca30: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
ca40: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
ca50: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
ca60: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
ca70: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
ca80: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
ca90: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
caa0: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
cab0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
cac0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
cad0: 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
cae0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
caf0: 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
cb00: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
cb10: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
cb20: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
cb30: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
cb40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
cb50: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
cb60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cb70: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
cb80: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
cb90: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
cba0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
cbb0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
cbc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
cbd0: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
cbe0: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
cbf0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
cc00: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
cc10: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
cc20: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
cc30: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
cc40: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
cc50: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
cc60: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
cc70: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
cc80: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
cc90: 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
cca0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
ccb0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
ccc0: 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
ccd0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
cce0: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
ccf0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
cd00: 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
cd10: 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
cd20: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
cd30: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
cd40: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
cd50: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
cd60: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
cd70: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
cd80: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
cd90: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
cda0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
cdb0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
cdc0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
cdd0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
cde0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
cdf0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ce00: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
ce10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
ce20: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
ce30: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ce40: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
ce50: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
ce60: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
ce70: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
ce80: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
ce90: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
cea0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
ceb0: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
cec0: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
ced0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
cee0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
cef0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
cf00: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
cf10: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
cf20: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
cf30: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
cf40: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
cf50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cf60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
cf70: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
cf80: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
cf90: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
cfa0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
cfb0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
cfc0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
cfd0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
cfe0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
cff0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
d000: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d010: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d020: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d030: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d040: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
d060: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
d070: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
d080: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d090: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
d0a0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d0b0: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
d0c0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
d0d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
d0e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
d0f0: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
d100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
d110: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
d120: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
d130: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
d140: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d150: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d160: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
d170: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
d180: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
d190: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
d1a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
d1b0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
d1c0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
d1d0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
d1e0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
d1f0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
d200: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
d210: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
d220: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
d230: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
d240: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
d250: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
d260: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
d270: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
d280: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
d290: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
d2a0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
d2b0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
d2c0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
d2d0: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
d2e0: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
d2f0: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
d300: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
d310: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
d320: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
d330: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
d340: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
d350: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
d360: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
d370: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
d380: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
d390: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
d3a0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
d3b0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
d3c0: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
d3d0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
d3e0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
d3f0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
d400: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
d410: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
d420: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
d430: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
d440: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
d450: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
d460: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
d470: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
d480: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
d490: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
d4a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d4b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d4c0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d4d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
d4e0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
d4f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
d500: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d510: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d520: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d530: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d540: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d550: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d560: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d570: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
d580: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
d590: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
d5a0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
d5b0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
d5c0: 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66  }.  }.  ..#ifdef
d5d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d5e0: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
d5f0: 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
d600: 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
d610: 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
d620: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
d630: 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
d640: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
d650: 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
d660: 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
d670: 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
d680: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
d690: 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
d6a0: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
d6b0: 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
d6c0: 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
d6d0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
d6e0: 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
d6f0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
d700: 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
d710: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
d720: 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
d730: 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
d740: 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
d750: 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
d760: 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
d770: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
d780: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
d790: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d7a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
d7b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
d7c0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
d7d0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
d7e0: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
d7f0: 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
d800: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
d810: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
d820: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
d830: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
d840: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
d850: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
d860: 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
d870: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
d880: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
d890: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
d8a0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d8b0: 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
d8c0: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
d8d0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
d8e0: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
d8f0: 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
d900: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
d910: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
d920: 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
d930: 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
d940: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
d950: 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
d960: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
d970: 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
d980: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
d990: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
d9a0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
d9b0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
d9c0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20  ixUnusedFd *p = 
d9d0: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  pFile->pUnused;.
d9e0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
d9f0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ode->pUnused;.  
da00: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
da10: 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
da20: 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
da30: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
da40: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
da50: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
da60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
da70: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
da80: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
da90: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
daa0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
dab0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
dac0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
dad0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
dae0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
daf0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
db00: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
db10: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
db20: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
db30: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
db40: 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
db50: 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
db60: 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
db70: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
db80: 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
db90: 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
dba0: 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
dbb0: 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
dbc0: 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
dbd0: 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
dbe0: 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
dbf0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
dc00: 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
dc10: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
dc20: 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
dc30: 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
dc40: 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
dc50: 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
dc60: 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
dc70: 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
dc80: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
dc90: 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
dca0: 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
dcb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dcc0: 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
dcd0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
dce0: 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
dcf0: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
dd00: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
dd10: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
dd20: 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
dd30: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
dd40: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
dd50: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
dd60: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
dd70: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
dd80: 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
dd90: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
dda0: 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
ddb0: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
ddc0: 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
ddd0: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
dde0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
ddf0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
de00: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
de10: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74  hared,.      get
de20: 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
de30: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
de40: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
de50: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
de60: 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
de70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
de80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
de90: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
dea0: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
deb0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
dec0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
ded0: 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
dee0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
def0: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
df00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
df10: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
df20: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
df30: 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
df40: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
df50: 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
df60: 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
df70: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
df80: 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
df90: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
dfa0: 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
dfb0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
dfc0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
dfd0: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
dfe0: 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
dff0: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
e000: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
e010: 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
e020: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e030: 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
e040: 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
e050: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
e060: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
e070: 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
e080: 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
e090: 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
e0a0: 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
e0b0: 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
e0c0: 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
e0d0: 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
e0e0: 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
e0f0: 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
e100: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
e110: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
e120: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
e130: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
e140: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
e150: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
e160: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
e170: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
e180: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
e190: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
e1a0: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
e1b0: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
e1c0: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
e1d0: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
e1e0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
e1f0: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
e200: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
e210: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
e220: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
e230: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
e240: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
e250: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
e260: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
e270: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
e280: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
e290: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
e2a0: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
e2b0: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
e2c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
e2d0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
e2e0: 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65 66 69  CK ){..#if !defi
e2f0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
e300: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
e310: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
e320: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
e330: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
e340: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
e350: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
e360: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
e370: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
e380: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e390: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
e3a0: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
e3b0: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
e3c0: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e3e0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
e3f0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
e400: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
e410: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
e420: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
e430: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
e440: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
e450: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
e460: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e470: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
e480: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
e490: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
e4a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
e4b0: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
e4c0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
e4d0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
e4e0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
e4f0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e500: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
e510: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e520: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
e530: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e540: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e550: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e560: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e570: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
e580: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
e590: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
e5a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
e5b0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
e5c0: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
e5d0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e5e0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e5f0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e600: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
e610: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
e620: 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
e630: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
e640: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
e650: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
e660: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
e670: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
e680: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
e690: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
e6a0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
e6b0: 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
e6c0: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e6d0: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
e6e0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
e6f0: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
e700: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
e710: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
e720: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
e730: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
e740: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e750: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
e760: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
e770: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
e780: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e790: 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
e7a0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
e7b0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
e7c0: 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
e7d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e7e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e7f0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
e800: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
e810: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e820: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e830: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
e840: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
e850: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
e860: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
e870: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
e880: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
e890: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
e8a0: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
e8b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e8c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
e8d0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
e8e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
e8f0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
e900: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
e910: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e920: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
e930: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e940: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
e950: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e960: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e970: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e980: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e990: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
e9a0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e9b0: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
e9c0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
e9d0: 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  , the call to un
e9e0: 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e  ixFileLock() can
e9f0: 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73 65  not fail because
ea00: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20   another.       
ea10: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73     ** process is
ea20: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f   holding an inco
ea30: 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49  mpatible lock. I
ea40: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20  f it does, this 
ea50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
ea60: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
ea70: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
ea80: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  s not following 
ea90: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20  the locking.    
eaa0: 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f        ** protoco
eab0: 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  l. If this happe
eac0: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
ead0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20  E_IOERR_RDLOCK. 
eae0: 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  Returning.      
eaf0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
eb00: 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65  SY would confuse
eb10: 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
eb20: 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69 74   (in practice it
eb30: 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20 20   causes .       
eb40: 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20     ** an assert 
eb50: 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20  to fail). */ .  
eb60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
eb70: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
eb80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  ;.          pFil
eb90: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
eba0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
ebb0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
ebc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ebd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
ebe0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ebf0: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
ec00: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ec10: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
ec20: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
ec30: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
ec40: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
ec50: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
ec60: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
ec70: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
ec80: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
ec90: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
eca0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
ecb0: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
ecc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ecd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ece0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
ecf0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
ed00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ed10: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ed20: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
ed30: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  if( eFileLock==N
ed40: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a  O_LOCK ){.    /*
ed50: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
ed60: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
ed70: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
ed80: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
ed90: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
eda0: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
edb0: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
edc0: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
edd0: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
ede0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
edf0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
ee00: 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
ee10: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
ee20: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
ee30: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
ee40: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
ee50: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ee60: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
ee70: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
ee80: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
ee90: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
eea0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  ile, &lock)==0 )
eeb0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
eec0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
eed0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
eee0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
eef0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
ef00: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
ef10: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
ef20: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
ef30: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ef40: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
ef50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
ef60: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
ef70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ef80: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
ef90: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
efa0: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
efb0: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
efc0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
efd0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
efe0: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
eff0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f000: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
f010: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
f020: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
f030: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
f040: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
f050: 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
f060: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
f070: 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
f080: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
f090: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c  k==0 ){.      cl
f0a0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
f0b0: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
f0c0: 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
f0d0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
f0e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f0f0: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
f100: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
f110: 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
f120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
f130: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
f140: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
f150: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
f160: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
f170: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
f180: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
f190: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
f1a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
f1b0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
f1c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f1d0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
f1e0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
f1f0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
f200: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
f210: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
f220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
f230: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
f240: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f250: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
f260: 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
f270: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
f280: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
f290: 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
f2a0: 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
f2b0: 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
f2c0: 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
f2d0: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
f2e0: 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
f2f0: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
f300: 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
f310: 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
f320: 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
f330: 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
f340: 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
f350: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
f360: 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
f370: 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
f380: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
f390: 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
f3a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
f3b0: 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
f3c0: 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
f3d0: 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
f3e0: 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
f3f0: 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
f400: 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
f410: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
f420: 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
f430: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f440: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
f450: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
f460: 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
f470: 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72  e->h>=0 ){.    r
f480: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
f490: 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c  e, pFile->h, __L
f4a0: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c  INE__);.    pFil
f4b0: 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  e->h = -1;.  }.#
f4c0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
f4d0: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29  if( pFile->pId )
f4e0: 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  {.    if( pFile-
f4f0: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
f500: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a  XFILE_DELETE ){.
f510: 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
f520: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
f530: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
f540: 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c  }.    vxworksRel
f550: 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65  easeFileId(pFile
f560: 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c  ->pId);.    pFil
f570: 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a  e->pId = 0;.  }.
f580: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
f590: 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  (("CLOSE   %-3d\
f5a0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
f5b0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
f5c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
f5d0: 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  e(pFile->pUnused
f5e0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
f5f0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  e, 0, sizeof(uni
f600: 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72  xFile));.  retur
f610: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f620: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
f630: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
f640: 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69  t unixClose(sqli
f650: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
f660: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f670: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
f680: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f690: 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55  le *)id;.  unixU
f6a0: 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
f6b0: 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  K);.  unixEnterM
f6c0: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e  utex();..  /* un
f6d0: 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73  ixFile.pInode is
f6e0: 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65   always valid he
f6f0: 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  re. Otherwise, a
f700: 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65   different close
f710: 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65  .  ** routine (e
f720: 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  .g. nolockClose(
f730: 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c  )) would be call
f740: 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f  ed instead..  */
f750: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
f760: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ->pInode->nLock>
f770: 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  0 || pFile->pIno
f780: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
f790: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ==0 );.  if( ALW
f7a0: 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  AYS(pFile->pInod
f7b0: 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  e) && pFile->pIn
f7c0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
f7d0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
f7e0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
f7f0: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
f800: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
f810: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
f820: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
f830: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
f840: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
f850: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
f860: 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
f870: 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55  or to pInode->pU
f880: 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20  nused list.  It 
f890: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
f8a0: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20  cally closed .  
f8b0: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61    ** when the la
f8c0: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
f8d0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
f8e0: 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
f8f0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
f900: 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
f910: 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  );.  rc = closeU
f920: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75  nixFile(id);.  u
f930: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
f940: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f950: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
f960: 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   End of the posi
f970: 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20  x advisory lock 
f980: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
f990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9a0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
f9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
f9f0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
fa00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa40: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
fa50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa60: 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a   No-op Locking *
fa70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa90: 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76  *.**.** Of the v
faa0: 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69  arious locking i
fab0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
fac0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69  vailable, this i
fad0: 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20  s by far the.** 
fae0: 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69  simplest:  locki
faf0: 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  ng is ignored.  
fb00: 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  No attempt is ma
fb10: 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64  de to lock the d
fb20: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
fb30: 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77  for reading or w
fb40: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
fb50: 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
fb60: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
fb70: 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f  or use on read-o
fb80: 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  nly databases.**
fb90: 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20   (ex: databases 
fba0: 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20  that are burned 
fbb0: 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72  into CD-ROM, for
fbc0: 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63   example.)  It c
fbd0: 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73  an.** also be us
fbe0: 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63  ed if the applic
fbf0: 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f  ation employs so
fc00: 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68  me external mech
fc10: 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76  anism to.** prev
fc20: 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ent simultaneous
fc30: 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73   access of the s
fc40: 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20  ame database by 
fc50: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64  two or more.** d
fc60: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
fc70: 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  ons.  But there 
fc80: 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73  is a serious ris
fc90: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a  k of database.**
fca0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74   corruption if t
fcb0: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
fcc0: 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75   is used in situ
fcd0: 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c  ations where mul
fce0: 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73  tiple.** databas
fcf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
fd00: 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
fd10: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
fd20: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a  le at the same.*
fd30: 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f  * time and one o
fd40: 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20  r more of those 
fd50: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
fd60: 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61  writing..*/..sta
fd70: 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68  tic int nolockCh
fd80: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
fd90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
fda0: 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73  tUsed, int *pRes
fdb0: 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
fdc0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
fdd0: 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
fde0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
fdf0: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
fe00: 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73  int nolockLock(s
fe10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
fe20: 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
fe30: 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
fe40: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
fe50: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
fe60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fe70: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
fe80: 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
fe90: 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
fea0: 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
feb0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
fec0: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
fed0: 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
fee0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fef0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
ff00: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
ff10: 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28  int nolockClose(
ff20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ff30: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f  ) {.  return clo
ff40: 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
ff50: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
ff60: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
ff70: 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d  he no-op lock im
ff80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
ff90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffa0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
ffb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fff0: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
10000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
10060 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63  gin dot-file Loc
10070 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
10080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10090 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  ***.**.** The do
100a0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  tfile locking im
100b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
100c0 73 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  s the existance 
100d0 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b  of separate lock
100e0 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c  .** files (reall
100f0 79 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74  y a directory) t
10100 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
10110 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
10120 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a  .  This works.**
10130 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65   on just about e
10140 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20  very filesystem 
10150 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74  imaginable.  But
10160 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f   there are serio
10170 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a  us downsides:.**
10180 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72  .**    (1)  Ther
10190 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72  e is zero concur
101a0 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65  rency.  A single
101b0 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61   reader blocks a
101c0 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  ll other.**     
101d0 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
101e0 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20  from reading or 
101f0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
10200 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  base..**.**    (
10210 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69  2)  An applicati
10220 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65  on crash or powe
10230 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65  r loss can leave
10240 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65   stale lock file
10250 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74  s.**         sit
10260 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74  ting around that
10270 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
10280 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a  red manually..**
10290 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73  .** Nevertheless
102a0 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61  , a dotlock is a
102b0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  n appropriate lo
102c0 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75  cking mode for u
102d0 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65  se if no.** othe
102e0 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  r locking strate
102f0 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  gy is available.
10300 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c  .**.** Dotfile l
10310 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20  ocking works by 
10320 63 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69  creating a subdi
10330 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73  rectory in the s
10340 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
10350 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
10360 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
10370 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
10380 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
10390 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
103a0 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
103b0 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  a lock directory
103c0 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c   implies an EXCL
103d0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c  USIVE lock.  All
103e0 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74   other.** lock t
103f0 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45  ypes (SHARED, RE
10400 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29  SERVED, PENDING)
10410 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f   are mapped into
10420 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a   EXCLUSIVE..*/..
10430 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73  /*.** The file s
10440 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  uffix added to t
10450 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c  he data base fil
10460 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74  ename in order t
10470 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
10480 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a  lock directory..
10490 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f  */.#define DOTLO
104a0 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b  CK_SUFFIX ".lock
104b0 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "../*.** This ro
104c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
104d0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
104e0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
104f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
10500 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
10510 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
10520 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
10530 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
10540 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
10550 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
10560 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
10570 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
10580 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
10590 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
105a0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
105b0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
105c0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
105d0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a  ock checking..**
105e0 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c  .** In dotfile l
105f0 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61  ocking, either a
10600 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20   lock exists or 
10610 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f  it does not.  So
10620 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   in this.** vari
10630 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65  ation of CheckRe
10640 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70  servedLock(), *p
10650 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
10660 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63   true if any loc
10670 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20  k.** is held on 
10680 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c  the file and fal
10690 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  se if the file i
106a0 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73  s unlocked..*/.s
106b0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
106c0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
106d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
106e0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
106f0 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
10700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
10710 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
10720 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10730 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10740 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
10750 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
10760 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
10770 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
10780 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
10790 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  le );..  /* Chec
107a0 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
107b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
107c0 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
107d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
107e0 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
107f0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
10800 45 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e  Either this conn
10810 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f  ection or some o
10820 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
10830 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
10840 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73  ess.    ** holds
10850 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
10860 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ile.  No need to
10870 20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20   check further. 
10880 2a 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  */.    reserved 
10890 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
108a0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73    /* The lock is
108b0 20 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c   held if and onl
108c0 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c  y if the lockfil
108d0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
108e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63  const char *zLoc
108f0 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  kFile = (const c
10900 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
10910 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
10920 72 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63  reserved = osAcc
10930 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30  ess(zLockFile, 0
10940 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  )==0;.  }.  OSTR
10950 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
10960 43 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74  CK %d %d %d (dot
10970 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
10980 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
10990 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  ));.  *pResOut =
109a0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
109b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
109c0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
109d0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
109e0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
109f0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
10a00 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
10a10 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
10a20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
10a30 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
10a40 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
10a50 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
10a60 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
10a70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
10a80 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
10a90 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
10aa0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
10ab0 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
10ac0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
10ad0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
10ae0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
10af0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
10b00 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
10b10 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
10b20 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
10b30 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
10b40 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
10b50 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
10b60 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
10b70 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
10b80 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
10b90 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
10ba0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
10bb0 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
10bc0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
10bd0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
10be0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
10bf0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
10c00 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
10c10 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
10c20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
10c30 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
10c40 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
10c50 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
10c60 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
10c70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10c80 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
10c90 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
10ca0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
10cb0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
10cc0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
10cd0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a  king level..**.*
10ce0 2a 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c  * With dotfile l
10cf0 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c  ocking, we reall
10d00 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73  y only support s
10d10 74 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53  tate (4): EXCLUS
10d20 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74  IVE..** But we t
10d30 72 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c  rack the other l
10d40 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e  ocking levels in
10d50 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61  ternally..*/.sta
10d60 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c  tic int dotlockL
10d70 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10d80 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
10d90 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
10da0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
10db0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
10dc0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
10dd0 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
10de0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
10df0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10e00 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  K;...  /* If we 
10e10 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74  have any lock, t
10e20 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  hen the lock fil
10e30 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
10e40 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20  .  All we have. 
10e50 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a   ** to do is adj
10e60 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ust our internal
10e70 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c   record of the l
10e80 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a  ock level..  */.
10e90 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10ea0 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
10eb0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
10ec0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10ed0 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77  Lock;.    /* Alw
10ee0 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
10ef0 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
10f00 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64  old file */.#ifd
10f10 65 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20  ef HAVE_UTIME.  
10f20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c    utime(zLockFil
10f30 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a  e, NULL);.#else.
10f40 20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b      utimes(zLock
10f50 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  File, NULL);.#en
10f60 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
10f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10f80 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
10f90 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
10fa0 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a    rc = osMkdir(z
10fb0 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b  LockFile, 0777);
10fc0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
10fd0 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
10fe0 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
10ff0 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a  lock directory *
11000 2f 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  /.    int tErrno
11010 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
11020 28 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72  ( EEXIST == tErr
11030 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  no ){.      rc =
11040 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11050 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11060 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11070 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11080 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11090 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
110a0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
110b0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
110c0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
110d0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
110e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
110f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a  return rc;.  } .
11100 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20    .  /* got it, 
11110 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
11120 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
11130 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11140 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
11150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11160 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
11170 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
11180 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
11190 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
111a0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
111b0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
111c0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
111d0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
111e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
111f0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
11200 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
11210 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
11220 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
11230 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
11240 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11250 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
11260 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  When the locking
11270 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e   level reaches N
11280 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74  O_LOCK, delete t
11290 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  he lock file..*/
112a0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
112b0 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
112c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
112d0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
112e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
112f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11300 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
11310 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c  e = (char *)pFil
11320 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
11330 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
11340 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11350 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
11360 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
11370 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
11380 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
11390 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
113a0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
113b0 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
113c0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
113d0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
113e0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
113f0 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
11400 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
11410 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
11420 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
11430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
11450 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
11460 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
11470 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
11480 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
11490 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
114a0 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
114b0 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
114c0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
114d0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
114e0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
114f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11500 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
11510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11520 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11530 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
11540 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
11550 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
11560 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
11570 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
11580 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
11590 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
115a0 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 65  .  if( rc<0 && e
115b0 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20  rrno==ENOTDIR ) 
115c0 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c  rc = osUnlink(zL
115d0 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ockFile);.  if( 
115e0 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc<0 ){.    int 
115f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
11600 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
11610 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45  if( ENOENT != tE
11620 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  rrno ){.      rc
11630 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
11640 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  UNLOCK;.    }.  
11650 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
11660 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
11670 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11680 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
11690 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
116a0 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
116b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
116c0 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
116d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
116e0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20   Close a file.  
116f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
11700 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65  ck has been rele
11710 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73  ased before clos
11720 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
11730 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28  nt dotlockClose(
11740 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11750 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
11760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
11770 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
11780 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11790 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64  xFile*)id;.    d
117a0 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
117b0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73   NO_LOCK);.    s
117c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
117d0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
117e0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f  t);.    rc = clo
117f0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
11800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11810 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
11820 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
11830 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20  e dot-file lock 
11840 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11860 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118b0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
118c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11900 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
11920 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69  egin flock Locki
11930 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
11940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11950 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ***.**.** Use th
11960 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d  e flock() system
11970 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65   call to do file
11980 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   locking..**.** 
11990 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
119a0 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65  is like dot-file
119b0 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74   locking in that
119c0 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20   the various.** 
119d0 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69  fine-grain locki
119e0 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72  ng levels suppor
119f0 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72  ted by SQLite ar
11a00 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f  e collapsed into
11a10 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63  .** a single exc
11a20 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e  lusive lock.  In
11a30 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48   other words, SH
11a40 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
11a50 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c  and.** PENDING l
11a60 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d  ocks are the sam
11a70 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58  e thing as an EX
11a80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53  CLUSIVE lock.  S
11a90 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77  QLite.** still w
11aa0 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f  orks when you do
11ab0 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75   this, but concu
11ac0 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65  rrency is reduce
11ad0 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20  d since.** only 
11ae0 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
11af0 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20   can be reading 
11b00 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
11b10 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d  a time..**.** Om
11b20 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20  it this section 
11b30 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
11b40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69  _LOCKING_STYLE i
11b50 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20  s turned off or 
11b60 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20  if.** compiling 
11b70 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a  for VXWORKS..*/.
11b80 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
11b90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
11ba0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a  && !OS_VXWORKS..
11bb0 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
11bc0 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
11bd0 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
11be0 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
11bf0 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
11c00 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
11c10 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
11c20 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
11c30 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
11c40 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
11c50 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
11c60 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
11c70 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
11c80 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
11c90 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
11ca0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
11cb0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
11cc0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
11cd0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
11ce0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
11cf0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
11d00 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
11d10 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
11d20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
11d30 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
11d40 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
11d50 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
11d60 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
11d70 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
11d80 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
11d90 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
11da0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
11db0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11dc0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
11dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
11de0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
11df0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
11e00 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
11e10 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
11e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
11e30 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
11e40 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11e50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11e60 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
11e70 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
11e80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
11e90 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
11ea0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
11eb0 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
11ec0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11ed0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11ee0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11ef0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
11f00 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11f10 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11f20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
11f30 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
11f40 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
11f50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
11f60 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
11f70 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
11f80 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
11f90 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
11fa0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
11fb0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
11fc0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
11fd0 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
11fe0 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
11ff0 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
12000 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
12010 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
12020 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12030 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
12040 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
12050 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12060 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12070 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
12080 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
12090 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
120a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
120b0 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20  NLOCK; .        
120c0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
120d0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
120e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
120f0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
12100 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72           rc = lr
12110 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12120 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
12130 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
12140 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
12150 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
12160 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
12170 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65   else might have
12180 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a   it reserved */.
12190 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69        lrc = sqli
121a0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
121b0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
121c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
121d0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f  ; .      if( IS_
121e0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
121f0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
12200 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
12210 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
12220 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = lrc;.      }.
12230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
12240 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
12250 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f  CK %d %d %d (flo
12260 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12270 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
12280 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
12290 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
122a0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
122b0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
122c0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
122d0 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
122e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
122f0 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
12300 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12310 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12320 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
12330 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
12340 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
12350 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
12360 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
12370 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
12380 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
12390 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
123a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
123b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
123c0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
123d0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
123e0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
123f0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12400 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12410 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
12420 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
12430 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12440 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12450 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12460 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12470 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12480 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
12490 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
124a0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
124b0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
124c0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
124d0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
124e0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
124f0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
12500 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
12510 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
12520 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
12530 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12540 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12550 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12560 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12570 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12580 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12590 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
125a0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
125b0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
125c0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
125d0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
125e0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
125f0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
12600 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63  USIVE.**.** floc
12610 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  k() only really 
12620 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
12630 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
12640 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
12650 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
12660 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
12670 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
12680 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
12690 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
126a0 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
126b0 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
126c0 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
126d0 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
126e0 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
126f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
12700 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
12710 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
12720 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
12730 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
12740 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
12750 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
12760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12770 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
12780 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
12790 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e  FileLock) {.  in
127a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
127b0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
127c0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
127d0 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
127e0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69  pFile );..  /* i
127f0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
12800 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
12810 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
12820 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
12830 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
12840 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
12850 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
12860 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
12870 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
12880 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
12890 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
128a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
128b0 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65   .  /* grab an e
128c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
128d0 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74  .  .  if (robust
128e0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
128f0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
12900 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74  NB)) {.    int t
12910 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12920 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74     /* didn't get
12930 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a  , must be busy *
12940 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12950 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12960 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12970 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
12980 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
12990 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
129a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
129b0 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
129c0 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
129d0 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
129e0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
129f0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
12a00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12a10 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
12a20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c   }.  OSTRACE(("L
12a30 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
12a40 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
12a50 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
12a60 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
12a70 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
12a80 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
12a90 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64  "failed"));.#ifd
12aa0 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
12ab0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12ac0 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
12ad0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
12ae0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
12af0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12b00 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BUSY;.  }.#endif
12b10 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
12b20 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12b30 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ORS */.  return 
12b40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
12b50 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
12b60 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
12b70 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12b80 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12b90 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12ba0 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12bb0 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12bc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12bd0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12be0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12bf0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12c00 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12c10 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
12c20 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
12c30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12c40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
12c50 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
12c60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12c70 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
12c80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12c90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12ca0 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
12cb0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
12cc0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
12cd0 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
12ce0 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
12cf0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
12d00 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
12d10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
12d20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
12d30 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
12d40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12d50 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
12d60 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
12d70 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12d80 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
12d90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12da0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12db0 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
12dc0 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
12dd0 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
12de0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
12df0 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
12e00 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
12e10 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12e20 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
12e30 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
12e40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
12e50 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
12e60 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
12e70 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f( robust_flock(
12e80 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
12e90 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  N) ){.#ifdef SQL
12ea0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12eb0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
12ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12ed0 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
12ee0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12ef0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
12f00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12f10 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
12f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
12f30 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12f40 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
12f50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12f60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
12f70 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
12f80 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
12f90 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12fa0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
12fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12fc0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f  f( id ){.    flo
12fd0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
12fe0 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20  LOCK);.    rc = 
12ff0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
13000 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13010 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
13020 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
13030 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
13040 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
13050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13060 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
13070 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
13080 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
130f0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13150 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
13160 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
13170 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
13180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13190 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
131a0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
131b0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
131c0 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
131d0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
131e0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
131f0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
13200 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
13210 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
13220 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
13230 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
13240 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
13250 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
13260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13270 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
13280 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
13290 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
132a0 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
132b0 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
132c0 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
132d0 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
132e0 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
132f0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
13300 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
13310 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
13320 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
13330 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
13340 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
13350 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
13360 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
13370 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
13380 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
13390 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
133a0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
133b0 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
133c0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
133d0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
133e0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
133f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
13400 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
13410 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
13420 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65   semCheckReserve
13430 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
13440 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
13450 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
13460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13470 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13480 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13490 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
134a0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
134b0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
134c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
134d0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
134e0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
134f0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
13500 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
13510 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
13520 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
13530 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
13540 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
13550 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
13560 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
13570 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
13580 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
13590 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
135a0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
135b0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
135c0 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
135d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
135e0 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
135f0 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
13600 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
13610 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
13620 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
13630 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
13640 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
13650 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
13660 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13670 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13680 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13690 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
136a0 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
136b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
136c0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
136d0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
136e0 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
136f0 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
13700 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
13710 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
13720 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
13730 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
13740 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13750 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
13760 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
13770 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
13780 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
13790 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
137a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
137b0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
137c0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
137d0 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
137e0 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
137f0 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
13800 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
13810 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13820 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
13830 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
13840 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
13850 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
13860 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
13870 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
13880 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
13890 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
138a0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
138b0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
138c0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
138d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
138e0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
138f0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
13900 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
13910 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
13920 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
13930 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
13940 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
13950 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
13960 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
13970 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
13980 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
13990 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
139a0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
139b0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
139c0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
139d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
139e0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
139f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
13a00 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
13a10 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
13a20 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
13a30 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
13a40 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
13a50 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
13a60 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13a70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13a80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
13a90 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
13aa0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13ab0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
13ac0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
13ad0 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
13ae0 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
13af0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
13b00 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
13b10 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
13b20 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
13b30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
13b40 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
13b50 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
13b60 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
13b70 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
13b80 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
13b90 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
13ba0 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
13bb0 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
13bc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13bd0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
13be0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
13bf0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
13c00 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
13c10 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
13c20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
13c30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
13c40 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
13c50 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
13c60 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
13c70 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13c80 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
13c90 74 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  t fd;.  sem_t *p
13ca0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
13cb0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74  ode->pSem;.  int
13cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13cd0 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
13ce0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
13cf0 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
13d00 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
13d10 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
13d20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
13d30 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
13d40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
13d50 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
13d60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13d70 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13d90 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
13da0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
13db0 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f   /* lock semapho
13dc0 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20  re now but bail 
13dd0 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79  out when already
13de0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66   locked. */.  if
13df0 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
13e00 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72  em)==-1 ){.    r
13e10 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
13e20 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e  .    goto sem_en
13e30 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
13e40 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
13e50 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
13e60 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
13e70 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
13e80 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e  leLock;.. sem_en
13e90 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e  d_lock:.  return
13ea0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
13eb0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
13ec0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
13ed0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
13ee0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
13ef0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
13f00 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13f10 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
13f20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
13f30 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
13f40 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
13f50 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
13f60 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
13f70 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
13f80 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
13f90 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13fa0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
13fb0 74 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  t semUnlock(sqli
13fc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13fd0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
13fe0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13ff0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14000 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
14010 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
14020 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >pSem;..  assert
14030 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73  ( pFile );.  ass
14040 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f  ert( pSem );.  O
14050 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
14060 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
14070 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d=%d (sem)\n", p
14080 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
14090 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
140a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
140b0 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61   getpid()));.  a
140c0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
140d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
140e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
140f0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
14100 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14110 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
14120 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
14140 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
14150 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
14160 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
14170 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
14180 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
14190 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
141a0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
141b0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
141c0 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
141d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
141e0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
141f0 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  y unlock. */.  i
14200 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65  f ( sem_post(pSe
14210 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  m)==-1 ) {.    i
14220 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20  nt rc, tErrno = 
14230 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  errno;.    rc = 
14240 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14250 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14260 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
14270 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  NLOCK);.    if( 
14280 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
14290 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
142a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
142b0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
142c0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
142d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
142e0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
142f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14300 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
14310 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
14320 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73  atic int semClos
14330 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14340 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29  id) {.  if( id )
14350 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
14360 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14370 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e  e*)id;.    semUn
14380 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
14390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
143a0 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
143b0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
143c0 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
143d0 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
143e0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
143f0 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
14400 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
14410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14420 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
14430 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
14440 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
14450 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
14460 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
14470 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
14480 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14490 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
144a0 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
144b0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
144d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144f0 2a 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 2a 2a 2a 2a 2a 2a 2a  ****************
14510 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
14520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14580 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
14590 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
145a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
145c0 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
145d0 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
145e0 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
145f0 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
14600 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
14610 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
14620 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
14630 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
14640 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
14650 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
14660 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
14670 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
14680 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
14690 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
146a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
146b0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
146c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
146d0 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
146e0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
146f0 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
14700 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
14710 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
14720 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
14730 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14740 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
14750 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
14760 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14770 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
14780 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
14790 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
147a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
147b0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
147c0 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
147d0 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
147e0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
147f0 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
14800 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
14810 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
14820 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14830 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
14840 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
14850 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
14860 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
14870 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
14880 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
14890 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
148a0 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
148b0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
148c0 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
148d0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
148e0 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
148f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14900 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14910 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14920 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14930 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14940 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14970 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14980 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
14990 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
149a0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
149b0 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
149c0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
149d0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
149e0 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
149f0 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
14a00 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
14a10 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
14a20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
14a30 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
14a40 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
14a50 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
14a60 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
14a70 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
14a80 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
14a90 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
14aa0 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
14ab0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
14ac0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
14ad0 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
14ae0 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
14af0 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
14b00 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
14b10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
14b20 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
14b30 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
14b40 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
14b50 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
14b60 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
14b70 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
14b80 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
14b90 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
14ba0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
14bb0 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
14bc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14bd0 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
14be0 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
14bf0 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
14c00 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14c10 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
14c20 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
14c30 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
14c40 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
14c50 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
14c60 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
14c70 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
14c80 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
14c90 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
14ca0 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
14cb0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
14cc0 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
14cd0 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
14ce0 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
14cf0 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
14d00 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
14d10 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
14d20 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
14d30 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
14d40 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
14d50 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
14d60 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
14d70 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
14d80 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14d90 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
14da0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14db0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
14dc0 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
14dd0 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
14de0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
14df0 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
14e00 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
14e10 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
14e20 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
14e30 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
14e40 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
14e50 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
14e60 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
14e70 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
14e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14e90 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
14ea0 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
14eb0 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
14ec0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
14ed0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
14ee0 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
14ef0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
14f00 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
14f10 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
14f20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
14f30 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
14f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
14f50 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
14f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14f80 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
14f90 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
14fa0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
14fb0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
14fc0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
14fd0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
14fe0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
14ff0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
15000 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
15010 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15020 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
15030 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
15040 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15050 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15060 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
15070 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
15080 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
15090 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
150a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
150b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
150c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
150d0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
150e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
150f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15100 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15110 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15120 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15130 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
15140 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
15150 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15160 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
15170 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15180 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
15190 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
151a0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
151b0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
151c0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
151d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
151e0 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
151f0 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
15200 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
15210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15220 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
15230 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
15240 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15250 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15260 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
15270 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
15280 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
15290 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
152a0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
152b0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
152c0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
152d0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
152e0 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
152f0 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
15300 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
15310 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
15320 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
15330 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
15340 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
15350 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
15360 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
15370 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15380 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15390 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
153a0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
153b0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
153c0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
153d0 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
153e0 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
153f0 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
15400 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
15410 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
15420 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
15430 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
15440 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15450 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15460 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
15470 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15480 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
15490 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
154a0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
154b0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
154c0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
154d0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
154e0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
154f0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
15500 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
15510 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
15520 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
15530 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
15540 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
15550 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15560 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
15570 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
15580 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
15590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
155a0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
155b0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
155c0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
155d0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
155e0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
155f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15600 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
15610 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
15620 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
15630 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
15640 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
15650 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
15660 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15670 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
15680 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
15690 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
156a0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
156b0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
156c0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
156d0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
156e0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
156f0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
15700 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
15710 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
15720 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
15730 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
15740 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
15750 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
15760 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
15770 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
15780 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
15790 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
157a0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
157b0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
157c0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
157d0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
157e0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
157f0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
15800 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
15810 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
15820 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
15830 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
15840 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
15850 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15860 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
15870 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
15880 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
15890 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
158a0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
158b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
158c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
158d0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
158e0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
158f0 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
15900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15910 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15920 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15930 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
15940 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
15950 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
15960 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15970 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
15980 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
15990 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
159a0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
159b0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
159c0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
159d0 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
159e0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
159f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15a00 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15a10 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
15a20 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
15a30 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
15a40 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15a50 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
15a60 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
15a70 53 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28  Shared , getpid(
15a80 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
15a90 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15aa0 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
15ab0 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
15ac0 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
15ad0 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
15ae0 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
15af0 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c  se the afp_end_l
15b00 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
15b10 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
15b20 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
15b30 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
15b40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15b50 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
15b60 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
15b70 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
15b80 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
15b90 64 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e  dy held) (afp)\n
15ba0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
15bb0 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
15bc0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
15bd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15be0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
15bf0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
15c00 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
15c10 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  is correct.  ** 
15c20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
15c30 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
15c40 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
15c50 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
15c60 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
15c70 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
15c80 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
15c90 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
15ca0 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
15cb0 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
15cc0 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
15cd0 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
15ce0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
15cf0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
15d00 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  FileLock!=NO_LOC
15d10 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K || eFileLock==
15d20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15d30 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15d40 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
15d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
15d60 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45  ileLock!=RESERVE
15d70 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
15d80 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  >eFileLock==SHAR
15d90 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
15da0 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
15db0 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
15dc0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
15dd0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
15de0 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
15df0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
15e00 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
15e10 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
15e20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
15e30 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
15e40 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
15e50 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
15e60 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
15e70 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
15e80 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
15e90 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
15ea0 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
15eb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
15ec0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
15ed0 26 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64  & .       (pInod
15ee0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
15ef0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
15f00 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
15f10 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20  OCK)).     ){.  
15f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
15f30 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  SY;.    goto afp
15f40 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
15f50 20 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52   .  /* If a SHAR
15f60 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
15f70 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
15f80 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
15f90 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
15fa0 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
15fb0 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
15fc0 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
15fd0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
15fe0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
15ff0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
16000 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
16010 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
16020 20 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e   .     (pInode->
16030 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16040 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
16050 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
16060 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
16070 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
16080 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16090 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
160a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
160b0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
160c0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
160d0 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
160e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
160f0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16100 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16110 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
16120 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
16130 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16140 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20    }.    .  /* A 
16150 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
16160 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63  needed before ac
16170 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
16180 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65   lock and before
16190 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20  .  ** acquiring 
161a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
161b0 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
161c0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
161d0 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  DING will.  ** b
161e0 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f  e released..  */
161f0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
16200 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
16210 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
16220 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
16230 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16240 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
16250 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
16260 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
16270 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
16280 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
16290 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
162a0 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
162b0 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
162c0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
162d0 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
162e0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
162f0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
16300 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
16310 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
16320 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
16330 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
16340 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
16350 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
16360 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
16370 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
16380 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16390 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
163a0 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45  rc1, lrc2, lrc1E
163b0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  rrno = 0;.    lo
163c0 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20  ng lk, mask;.   
163d0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49   .    assert( pI
163e0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
163f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16400 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16410 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
16420 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a  .    mask = (siz
16430 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20  eof(long)==8) ? 
16440 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20  LARGEST_INT64 : 
16450 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
16460 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
16470 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f  ead-lock SHARED_
16480 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  LOCK */.    /* n
16490 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
164a0 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
164b0 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
164c0 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
164d0 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
164e0 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64  om(); .    pInod
164f0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20  e->sharedByte = 
16500 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41  (lk & mask)%(SHA
16510 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20  RED_SIZE - 1);. 
16520 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74     lrc1 = afpSet
16530 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16540 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20  Path, pFile, .  
16550 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
16560 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
16570 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  redByte, 1, 1);.
16580 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
16590 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20  ERROR(lrc1) ){. 
165a0 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d       lrc1Errno =
165b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
165c0 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  o;.    }.    /* 
165d0 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
165e0 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
165f0 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66  */.    lrc2 = af
16600 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16610 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16620 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16630 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  , 0);.    .    i
16640 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16650 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20  (lrc1) ) {.     
16660 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16670 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20  o = lrc1Errno;. 
16680 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
16690 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
166a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
166b0 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f  lse if( IS_LOCK_
166c0 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20  ERROR(lrc2) ){. 
166d0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a       rc = lrc2;.
166e0 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
166f0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65  nd_lock;.    } e
16700 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20  lse if( lrc1 != 
16710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
16720 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
16730 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
16740 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16750 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
16760 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
16770 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
16780 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d  Inode->nShared =
16790 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
167a0 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
167b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
167c0 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  && pInode->nShar
167d0 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ed>1 ){.    /* W
167e0 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72  e are trying for
167f0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
16800 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74  ck but another t
16810 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20  hread in this.  
16820 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
16830 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
16840 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
16850 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
16860 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
16870 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
16880 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
16890 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
168a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
168b0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
168c0 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
168d0 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
168e0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
168f0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
16900 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
16910 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
16920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
16930 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
16940 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69  k );.    if (eFi
16950 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56  leLock >= RESERV
16960 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
16970 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45  ->eFileLock < RE
16980 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
16990 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
169a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
169b0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
169c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
169d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
169e0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
169f0 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20  D_BYTE, 1,1);.  
16a00 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20      if( !failed 
16a10 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65  ){.        conte
16a20 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31  xt->reserved = 1
16a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16a40 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20      if (!failed 
16a50 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20  && eFileLock == 
16a60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
16a70 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69  {.      /* Acqui
16a80 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
16a90 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
16aa0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  .      /* Remove
16ab0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16ac0 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74   before trying t
16ad0 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c  he range.  we'll
16ae0 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20   need to .      
16af0 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  ** reestablish t
16b00 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
16b10 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74  f we can't get t
16b20 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20  he  afpUnlock.  
16b30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16b40 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53   !(failed = afpS
16b50 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16b60 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53  dbPath, pFile, S
16b70 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b90 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73         pInode->s
16ba0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29  haredByte, 1, 0)
16bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
16bc0 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54   failed2 = SQLIT
16bd0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  E_OK;.        /*
16be0 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
16bf0 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
16c00 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
16c10 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
16c20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16c30 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16c40 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ile, SHARED_FIRS
16c50 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16c80 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16c90 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65  failed && (faile
16ca0 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  d2 = afpSetLock(
16cb0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16cc0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70  SHARED_FIRST + p
16cf0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16d00 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20  e, 1, 1)) ){.   
16d10 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20         /* Can't 
16d20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
16d30 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71  shared lock.  Sq
16d40 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c  lite can't deal,
16d50 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20   this is.       
16d60 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c     ** a critical
16d70 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20   I/O error.     
16d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16d90 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20    rc = ((failed 
16da0 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
16db0 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
16dc0 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16de0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
16df0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
16e00 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
16e10 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
16e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16e30 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
16e40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16e50 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
16e60 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
16e70 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
16e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16e90 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
16ea0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16eb0 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
16ec0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
16ed0 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
16ee0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
16ef0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16f00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16f10 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
16f20 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
16f30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
16f40 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
16f50 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
16f60 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16f70 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
16f80 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
16f90 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
16fa0 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
16fb0 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
16fc0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
16fd0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
16fe0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
16ff0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
17000 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
17010 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
17020 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
17030 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
17040 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
17050 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
17060 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
17070 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
17080 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17090 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
170a0 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
170b0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
170c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
170d0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
170e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
170f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
17100 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
17110 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17120 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
17130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17140 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
17150 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17160 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
17170 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
17180 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
17190 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
171a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
171b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
171c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
171d0 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
171e0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
171f0 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
17200 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
17210 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
17220 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
17230 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
17240 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
17250 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
17260 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
17270 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
17280 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
17290 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
172a0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
172b0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
172c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65  d,.           ge
172d0 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73  tpid()));..  ass
172e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
172f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17300 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17310 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
17320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17340 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
17350 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
17360 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
17370 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
17380 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
17390 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
173a0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
173b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
173c0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
173d0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
173e0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
173f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
17400 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
17410 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
17420 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
17430 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
17440 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
17450 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
17460 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
17470 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
17480 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
17490 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
174a0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
174b0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
174c0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
174d0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
174e0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
174f0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
17500 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
17510 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
17520 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
17530 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
17540 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
17550 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
17560 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
17570 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
17580 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
17590 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
175a0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
175b0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
175c0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
175d0 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
175e0 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
175f0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
17600 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
17610 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17620 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
17630 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
17640 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
17650 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
17660 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
17670 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
17680 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
17690 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
176a0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
176b0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
176c0 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
176d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
176e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
176f0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
17700 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17710 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17720 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
17730 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
17740 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17750 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
17760 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17770 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
17780 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
17790 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
177a0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
177b0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
177c0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
177d0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
177e0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
177f0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17800 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
17810 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17820 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17830 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
17840 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
17850 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
17860 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
17870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17880 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17890 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
178a0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
178b0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
178c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
178d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
178e0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
178f0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
17900 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
17910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
17920 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
17930 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
17940 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
17950 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
17960 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17970 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17980 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17990 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
179a0 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
179b0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
179c0 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
179d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
179e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
179f0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
17a00 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17a10 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
17a20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
17a30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
17a40 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
17a50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
17a60 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
17a70 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
17a80 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
17a90 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
17aa0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
17ab0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
17ac0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
17ad0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
17ae0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
17af0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
17b00 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
17b10 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
17b20 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
17b30 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
17b40 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
17b50 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
17b60 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
17b70 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
17b80 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
17b90 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
17ba0 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
17bb0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17bc0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
17bd0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
17be0 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
17bf0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17c00 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
17c10 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
17c20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
17c30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17c40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
17c50 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
17c60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
17c70 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
17c80 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
17c90 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17ca0 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
17cb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
17cc0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
17cd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17cf0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
17d00 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
17d10 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
17d20 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
17d30 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
17d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
17d50 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
17d60 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
17d70 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
17d80 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
17d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17da0 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
17db0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17dc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17dd0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
17de0 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
17df0 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
17e00 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
17e10 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
17e20 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
17e30 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
17e40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17e50 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
17e60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17e70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
17e80 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
17e90 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
17ea0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
17eb0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
17ec0 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
17ed0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
17ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
17ef0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
17f00 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
17f10 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
17f20 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
17f30 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
17f40 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
17f50 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
17f60 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
17f70 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
17f80 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
17f90 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
17fa0 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
17fb0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
17fc0 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
17fd0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
17fe0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
17ff0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
18000 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
18010 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
18020 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
18030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18040 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
18050 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
18060 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
18070 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
18080 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
18090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
180a0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
180b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
180c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
180d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
180e0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
180f0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
18100 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
18110 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
18120 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
18130 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
18140 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
18150 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
18160 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
18170 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
18180 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
18190 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
181a0 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
181b0 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
181c0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
181d0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
181e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
181f0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
18200 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
18210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18220 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18270 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
18280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
182d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182e0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
182f0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
18300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18310 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
18320 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
18330 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
18340 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
18350 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
18360 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
18370 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
18380 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
18390 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
183a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
183b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
183c0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
183d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
183e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
183f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
18400 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
18410 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
18420 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
18430 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
18440 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
18450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
18460 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
18470 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
18480 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
18490 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
184a0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
184b0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
184c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
184d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
184e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
184f0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
18500 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
18510 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
18520 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18530 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
18540 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
18550 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
18560 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
18570 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
18580 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
18590 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
185a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
185c0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
185d0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
185e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
185f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
18640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
186a0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
186b0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
186c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
186e0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
186f0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
18700 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
18710 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
18720 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
18730 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
18740 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
18750 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
18760 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
18770 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
18780 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
18790 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
187a0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
187b0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
187c0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
187d0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
187e0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
187f0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
18800 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
18810 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
18820 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
18830 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
18840 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18850 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
18860 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
18870 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
18880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18890 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
188a0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
188b0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
188c0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
188d0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
188e0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
188f0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
18900 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
18910 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
18920 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
18930 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
18940 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
18950 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
18960 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
18970 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
18980 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
18990 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
189a0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
189b0 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
189c0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
189d0 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
189e0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
189f0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
18a00 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
18a10 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
18a20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
18a30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18a50 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
18a60 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
18a70 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
18a80 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
18a90 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
18aa0 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30  .  int prior = 0
18ab0 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
18ac0 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
18ad0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18ae0 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
18af0 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
18b00 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73  IMER_START;.  as
18b10 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26  sert( cnt==(cnt&
18b20 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63 6e  0x1ffff) );.  cn
18b30 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  t &= 0x1ffff;.  
18b40 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
18b50 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
18b60 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
18b70 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
18b80 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
18b90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
18ba0 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
18bb0 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
18bc0 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
18bd0 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
18be0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
18bf0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18c00 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
18c10 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
18c20 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
18c30 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
18c40 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
18c50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
18c60 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
18c70 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
18c80 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
18c90 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
18ca0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
18cb0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
18cc0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
18cd0 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  no;.      }else{
18ce0 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
18cf0 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
18d00 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rno = 0;.      }
18d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
18d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
18d30 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
18d40 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
18d50 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
18d60 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
18d70 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
18d80 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
18d90 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
18da0 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
18db0 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
18dc0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18dd0 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18de0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72   errno;.      br
18df0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
18e00 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
18e10 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
18e20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
18e30 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
18e40 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
18e50 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
18e60 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
18e70 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
18e80 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
18e90 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
18ea0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
18eb0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
18ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
18ed0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
18ee0 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
18ef0 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
18f00 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
18f10 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
18f20 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
18f30 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
18f40 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
18f50 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
18f60 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
18f70 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
18f80 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
18f90 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
18fa0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
18fb0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
18fc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18fd0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
18fe0 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
18ff0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
19000 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
19010 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19020 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
19030 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
19040 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  id );..  /* If t
19050 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
19060 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
19070 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
19080 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
19090 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
190a0 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
190b0 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
190c0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
190d0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
190e0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
190f0 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
19100 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
19110 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
19120 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
19130 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
19140 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
19150 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
19160 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
19170 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
19180 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
19190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
191a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
191b0 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
191c0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
191d0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
191e0 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
191f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
19200 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
19210 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19220 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
19230 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
19240 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
19250 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
19260 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
19270 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
19280 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
19290 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
192a0 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
192b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
192c0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
192d0 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
192e0 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d  he offset in id-
192f0 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61  >offset then rea
19300 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f  d cnt bytes into
19310 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e   pBuf..** Return
19320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19330 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
19340 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20  ad.  Update the 
19350 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  offset..**.** To
19360 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
19370 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
19380 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74  on a failed writ
19390 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  e the lastErrno 
193a0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
193b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
193c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
193d0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69  seekAndWrite(uni
193e0 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  xFile *id, i64 o
193f0 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69  ffset, const voi
19400 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
19410 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
19420 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f  f (!defined(USE_
19430 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e  PREAD) && !defin
19440 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29  ed(USE_PREAD64))
19450 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
19460 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
19470 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31  t( cnt==(cnt&0x1
19480 66 66 66 66 29 20 29 3b 0a 20 20 63 6e 74 20 26  ffff) );.  cnt &
19490 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d  = 0x1ffff;.  TIM
194a0 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
194b0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
194c0 0a 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 50  .  do{ got = osP
194d0 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  write(id->h, pBu
194e0 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
194f0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26   }while( got<0 &
19500 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
19510 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19520 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64  USE_PREAD64).  d
19530 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
19540 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
19550 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 7d 77   cnt, offset);}w
19560 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65  hile( got<0 && e
19570 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65  rrno==EINTR);.#e
19580 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 6e 65  lse.  do{.    ne
19590 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
195a0 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
195b0 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
195c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
195d0 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
195e0 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
195f0 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
19600 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
19610 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
19620 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
19630 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
19640 6e 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  no;.      }else{
19650 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46  .        ((unixF
19660 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
19670 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rno = 0;.      }
19680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
196a0 3d 20 6f 73 57 72 69 74 65 28 69 64 2d 3e 68 2c  = osWrite(id->h,
196b0 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 20 20 7d   pBuf, cnt);.  }
196c0 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
196d0 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
196e0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45  #endif.  TIMER_E
196f0 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20  ND;.  if( got<0 
19700 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c  ){.    ((unixFil
19710 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
19720 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a  o = errno;.  }..
19730 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
19740 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
19750 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e  ld %llu\n", id->
19760 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20  h, got, offset, 
19770 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
19780 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
19790 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
197a0 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
197b0 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
197c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
197d0 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
197e0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
197f0 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
19800 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
19810 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
19820 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19830 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
19840 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
19850 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
19860 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
19870 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
19880 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
19890 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
198a0 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
198b0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
198c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
198d0 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
198e0 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
198f0 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
19900 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
19910 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
19920 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
19930 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
19940 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
19950 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
19960 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19970 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
19980 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
19990 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
199a0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
199b0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
199c0 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
199d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
199e0 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
199f0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
19a00 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
19a10 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
19a20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
19a30 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
19a40 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
19a50 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
19a60 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
19a70 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
19a80 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
19a90 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
19aa0 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
19ab0 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
19ac0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
19ad0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
19ae0 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
19af0 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
19b00 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
19b10 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
19b20 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
19b30 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
19b40 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
19b50 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
19b60 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
19b70 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
19b80 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
19b90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
19ba0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
19bb0 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
19bc0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19bd0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
19be0 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
19bf0 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
19c00 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
19c10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
19c20 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
19c30 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
19c40 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
19c50 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
19c60 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
19c70 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
19c80 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
19c90 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
19ca0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
19cb0 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
19cc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
19cd0 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61  ndif..  while( a
19ce0 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
19cf0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
19d00 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75  ile, offset, pBu
19d10 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
19d20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
19d30 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
19d40 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
19d50 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
19d60 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
19d70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
19d80 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
19d90 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
19da0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
19db0 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
19dc0 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  ;..  if( amt>0 )
19dd0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
19de0 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
19df0 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
19e00 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
19e10 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
19e20 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
19e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
19e40 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
19e50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
19e60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
19e70 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
19e80 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
19e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ea0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
19eb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19ec0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
19ed0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
19ee0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
19ef0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
19f00 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
19f10 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
19f20 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
19f30 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
19f40 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
19f50 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
19f60 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
19f70 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
19f80 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
19f90 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
19fa0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
19fb0 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
19fc0 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
19fd0 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
19fe0 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
19ff0 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1a000 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1a010 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1a020 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1a030 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1a040 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1a050 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1a060 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1a070 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1a080 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1a090 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1a0a0 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1a0b0 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23  c=fdatasync.*/.#
1a0c0 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1a0d0 61 73 79 6e 63 29 0a 23 20 64 65 66 69 6e 65 20  async).# define 
1a0e0 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1a0f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1a100 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1a110 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1a120 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1a130 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1a140 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1a150 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1a160 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1a170 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1a180 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1a190 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1a1a0 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1a1b0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1a1c0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1a1d0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1a1e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1a1f0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1a200 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1a210 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  he fsync() syste
1a220 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  m call does not 
1a230 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73  work as advertis
1a240 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e  ed on many.** un
1a250 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65  ix systems.  The
1a260 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65   following proce
1a270 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d  dure is an attem
1a280 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74  pt to make.** it
1a290 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a   work better..**
1a2a0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e  .** The SQLITE_N
1a2b0 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73  O_SYNC macro dis
1a2c0 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28  ables all fsync(
1a2d0 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  )s.  This is use
1a2e0 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69  ful.** for testi
1a2f0 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  ng when we want 
1a300 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74  to run through t
1a310 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75  he test suite qu
1a320 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72  ickly..** You ar
1a330 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73  e strongly advis
1a340 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c  ed *not* to depl
1a350 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  oy with SQLITE_N
1a360 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65  O_SYNC.** enable
1a370 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63  d, however, sinc
1a380 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  e with SQLITE_NO
1a390 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61  _SYNC enabled, a
1a3a0 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72  n OS crash.** or
1a3b0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
1a3c0 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75  ill likely corru
1a3d0 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  pt the database 
1a3e0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  file..**.** SQLi
1a3f0 74 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61  te sets the data
1a400 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65  Only flag if the
1a410 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1a420 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  e is unchanged..
1a430 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69  ** The idea behi
1a440 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74  nd dataOnly is t
1a450 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e  hat it should on
1a460 6c 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  ly write the fil
1a470 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20  e content.** to 
1a480 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e  disk, not the in
1a490 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65  ode.  We only se
1a4a0 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68  t dataOnly if th
1a4b0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a  e file size is .
1a4c0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e  ** unchanged sin
1a4d0 63 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ce the file size
1a4e0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
1a4f0 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c  inode.  However,
1a500 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65   .** Ted Ts'o te
1a510 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74  lls us that fdat
1a520 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73  async() will als
1a530 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64  o write the inod
1a540 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e if the.** file
1a550 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65   size has change
1a560 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  d.  The only rea
1a570 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  l difference bet
1a580 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29  ween fdatasync()
1a590 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c  .** and fsync(),
1a5a0 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69   Ted tells us, i
1a5b0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1a5c0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73  () will not flus
1a5d0 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69  h the.** inode i
1a5e0 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f  f the mtime or o
1a5f0 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e  wner or other in
1a600 6f 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68  ode attributes h
1a610 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20  ave changed..** 
1a620 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  We only care abo
1a630 75 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ut the file size
1a640 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20  , not the other 
1a650 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c  file attributes,
1a660 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73   so.** as far as
1a670 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65   SQLite is conce
1a680 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79  rned, an fdatasy
1a690 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61  nc() is always a
1a6a0 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20  dequate..** So, 
1a6b0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64  we always use fd
1a6c0 61 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20  atasync() if it 
1a6d0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
1a6e0 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74  gardless of.** t
1a6f0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1a700 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a  dataOnly flag..*
1a710 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
1a720 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
1a730 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e  int fullSync, in
1a740 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69  t dataOnly){.  i
1a750 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
1a760 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65   following "ifde
1a770 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c  f/elif/else/" bl
1a780 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65  ock has the same
1a790 20 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20   structure as.  
1a7a0 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77  ** the one below
1a7b0 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74  . It is replicat
1a7c0 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74  ed here solely t
1a7d0 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69  o avoid clutteri
1a7e0 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ng .  ** up the 
1a7f0 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74  real code with t
1a800 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  he UNUSED_PARAME
1a810 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  TER() macros..  
1a820 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1a830 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45  _NO_SYNC.  UNUSE
1a840 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1a850 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a860 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1a870 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a880 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c  R(dataOnly);.#el
1a890 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1a8a0 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1a8b0 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1a8c0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
1a8d0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1a8e0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1a8f0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1a900 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
1a910 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
1a920 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
1a930 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
1a940 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
1a950 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
1a960 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
1a970 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
1a980 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
1a990 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
1a9a0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
1a9b0 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
1a9c0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1a9d0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
1a9e0 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
1a9f0 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
1aa00 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
1aa10 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
1aa20 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
1aa30 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
1aa40 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
1aa50 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
1aa60 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
1aa70 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
1aa80 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1aa90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1aaa0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1aab0 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
1aac0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1aad0 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46   osFcntl(fd, F_F
1aae0 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20  ULLFSYNC, 0);.  
1aaf0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1ab00 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74  1;.  }.  /* If t
1ab10 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69  he FULLFSYNC fai
1ab20 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  led, fall back t
1ab30 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20  o attempting an 
1ab40 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74  fsync()..  ** It
1ab50 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f   shouldn't be po
1ab60 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66  ssible for fullf
1ab70 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20  sync to fail on 
1ab80 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20  the local .  ** 
1ab90 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20  file system (on 
1aba0 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65  OSX), so failure
1abb0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1abc0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69  FULLFSYNC.  ** i
1abd0 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66  sn't supported f
1abe0 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73  or this file sys
1abf0 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74  tem. So, attempt
1ac00 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20   an fsync .  ** 
1ac10 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67  and (for now) ig
1ac20 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61  nore the overhea
1ac30 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f  d of a superfluo
1ac40 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20  us fcntl call.  
1ac50 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65  .  ** It'd be be
1ac60 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66  tter to detect f
1ac70 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74  ullfsync support
1ac80 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20   once and avoid 
1ac90 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20  .  ** the fcntl 
1aca0 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20  call every time 
1acb0 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a  sync is called..
1acc0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
1acd0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1ace0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
1acf0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66  _APPLE__).  /* f
1ad00 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46  datasync() on HF
1ad10 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66  S+ doesn't yet f
1ad20 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69  lush the file si
1ad30 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64  ze if it changed
1ad40 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1ad50 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20  so currently we 
1ad60 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d  default to the m
1ad70 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69  acro that redefi
1ad80 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f  nes fdatasync to
1ad90 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63   fsync.  */.  rc
1ada0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65   = fsync(fd);.#e
1adb0 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74  lse .  rc = fdat
1adc0 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f  async(fd);.#if O
1add0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
1ade0 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d  rc==-1 && errno=
1adf0 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20  =ENOTSUP ){.    
1ae00 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1ae10 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53    }.#endif /* OS
1ae20 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64  _VXWORKS */.#end
1ae30 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49  if /* ifdef SQLI
1ae40 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20  TE_NO_SYNC elif 
1ae50 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
1ae60 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f  /..  if( OS_VXWO
1ae70 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29  RKS && rc!= -1 )
1ae80 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
1ae90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1aea0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
1aeb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1aec0 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
1aed0 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20  containing file 
1aee0 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66  zFilename..** If
1aef0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46   successful, *pF
1af00 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
1af10 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63  opened file desc
1af20 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51  riptor and.** SQ
1af30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1af40 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
1af50 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20   occurs, either 
1af60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
1af70 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or SQLITE_CANTOP
1af80 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EN is returned a
1af90 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  nd *pFd is set t
1afa0 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a  o an undefined.*
1afb0 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  * value..**.** T
1afc0 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
1afd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1afe0 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e  used for only on
1aff0 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20  e thing - to.** 
1b000 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74  fsync() a direct
1b010 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ory to make sure
1b020 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61   file creation a
1b030 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e  nd deletion even
1b040 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65  ts.** are flushe
1b050 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68  d to disk.  Such
1b060 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20   fsyncs are not 
1b070 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a  needed on newer.
1b080 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69  ** journaling fi
1b090 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61  lesystems, but a
1b0a0 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f  re required on o
1b0b0 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73  lder filesystems
1b0c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b0d0 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72  tine can be over
1b0e0 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65  ridden using the
1b0f0 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74   xSetSysCall int
1b100 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61  erface..** The a
1b110 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69  bility to overri
1b120 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  de this routine 
1b130 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70  was added in sup
1b140 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63  port of the.** c
1b150 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e  hromium sandbox.
1b160 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65    Opening a dire
1b170 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72  ctory is a secur
1b180 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65  ity risk (we are
1b190 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b  .** told) so mak
1b1a0 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61  ing it overridea
1b1b0 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ble allows the c
1b1c0 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20  hromium sandbox 
1b1d0 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  to.** replace th
1b1e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
1b1f0 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
1b200 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20  .  To make this 
1b210 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d  routine.** a no-
1b220 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77  op, replace it w
1b230 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20  ith a stub that 
1b240 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1b250 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20  K but leaves.** 
1b260 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65  *pFd set to a ne
1b270 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a  gative number..*
1b280 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1b290 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1b2a0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1b2b0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f  ponsible for clo
1b2c0 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65  sing.** the file
1b2d0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64   descriptor *pFd
1b2e0 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a   using close()..
1b2f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
1b300 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  enDirectory(cons
1b310 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1b320 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20  e, int *pFd){.  
1b330 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64  int ii;.  int fd
1b340 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44   = -1;.  char zD
1b350 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  irname[MAX_PATHN
1b360 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74  AME+1];..  sqlit
1b370 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1b380 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61  PATHNAME, zDirna
1b390 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  me, "%s", zFilen
1b3a0 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28  ame);.  for(ii=(
1b3b0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e  int)strlen(zDirn
1b3c0 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44  ame); ii>1 && zD
1b3d0 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b  irname[ii]!='/';
1b3e0 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69   ii--);.  if( ii
1b3f0 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61  >0 ){.    zDirna
1b400 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  me[ii] = '\0';. 
1b410 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
1b420 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1b430 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1b440 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e   0);.    if( fd>
1b450 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  =0 ){.      OSTR
1b460 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1b470 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1b480 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  irname));.    }.
1b490 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b    }.  *pFd = fd;
1b4a0 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30  .  return (fd>=0
1b4b0 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c  ?SQLITE_OK:unixL
1b4c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1b4d0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
1b4e0 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29  pen", zDirname))
1b4f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1b500 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1b510 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1b520 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1b530 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1b540 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1b550 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1b560 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1b570 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1b580 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1b590 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1b5a0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1b5b0 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1b5c0 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1b5d0 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1b5e0 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1b5f0 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1b600 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1b610 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1b620 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1b630 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1b640 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1b650 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1b660 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1b670 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1b680 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1b690 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1b6a0 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1b6b0 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1b6c0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1b6d0 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1b6e0 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1b6f0 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1b700 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1b710 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1b720 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1b730 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1b740 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1b750 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1b760 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1b770 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1b780 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1b790 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1b7a0 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1b7b0 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1b7c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1b7d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1b7e0 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1b7f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1b800 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1b810 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1b820 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1b830 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1b840 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1b850 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1b860 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1b870 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1b880 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1b890 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1b8a0 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1b8b0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1b8c0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1b8d0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1b8e0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1b8f0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1b900 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1b910 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1b920 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1b930 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1b940 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1b950 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1b960 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1b970 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1b980 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1b990 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1b9a0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1b9b0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1b9c0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1b9d0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1b9e0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1b9f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1ba00 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1ba10 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1ba20 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1ba30 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1ba40 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1ba50 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1ba60 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1ba70 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1ba80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
1ba90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1baa0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  = errno;.    ret
1bab0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1bac0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1bad0 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1bae0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1baf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1bb00 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1bb10 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1bb20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1bb30 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1bb40 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1bb50 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1bb60 63 75 72 72 61 6e 63 65 2e 20 20 4d 61 6e 79 20  currance.  Many 
1bb70 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1bb80 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1bb90 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1bba0 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1bbb0 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1bbc0 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1bbd0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1bbe0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1bbf0 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1bc00 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1bc10 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1bc20 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1bc30 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1bc40 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1bc50 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1bc60 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1bc70 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1bc80 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1bc90 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1bca0 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1bcb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1bcc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66  QLITE_OK && dirf
1bcd0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75  d>=0 ){.      fu
1bce0 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
1bcf0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62  0, 0);.      rob
1bd00 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c  ust_close(pFile,
1bd10 20 64 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f   dirfd, __LINE__
1bd20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1bd30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1bd40 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63  OPEN ){.      rc
1bd50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bd60 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1bd70 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1bd80 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1bd90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1bda0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1bdb0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1bdc0 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1bdd0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1bde0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1bdf0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1be00 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1be10 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1be20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1be30 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1be40 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1be50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1be60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1be70 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1be80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1be90 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1bea0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1beb0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1bec0 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1bed0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1bee0 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1bef0 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1bf00 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1bf10 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1bf20 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1bf30 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1bf40 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1bf50 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1bf60 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1bf70 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1bf80 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1bf90 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1bfa0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1bfb0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1bfc0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1bfd0 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1bfe0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1bff0 70 46 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74  pFile->h, (off_t
1c000 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72  )nByte);.  if( r
1c010 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
1c020 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1c030 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  o;.    return un
1c040 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1c050 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1c060 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1c070 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1c080 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
1c090 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1c0a0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1c0b0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1c0c0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1c0d0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1c0e0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1c0f0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1c100 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1c110 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1c120 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1c130 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1c140 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1c150 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1c160 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1c170 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1c180 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1c190 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1c1a0 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1c1b0 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1c1c0 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1c1d0 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1c1e0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1c1f0 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1c200 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1c210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c220 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1c230 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1c240 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1c250 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1c260 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1c270 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
1c280 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1c290 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
1c2a0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1c2b0 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
1c2c0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1c2d0 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
1c2e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1c2f0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1c300 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1c310 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
1c320 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
1c330 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46   osFstat(((unixF
1c340 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
1c350 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
1c360 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1c370 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1c380 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1c390 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
1c3a0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
1c3b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1c3c0 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
1c3d0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
1c3e0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
1c3f0 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
1c400 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
1c410 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
1c420 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
1c430 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
1c440 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
1c450 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
1c460 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
1c470 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
1c480 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
1c490 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
1c4a0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
1c4b0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
1c4c0 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
1c4d0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
1c4e0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
1c4f0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
1c500 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
1c510 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
1c520 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
1c530 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
1c540 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
1c550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
1c560 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c570 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1c580 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1c590 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
1c5a0 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
1c5b0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
1c5c0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
1c5d0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
1c5e0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
1c5f0 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
1c600 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
1c610 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1c620 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1c630 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a  );.#endif../* .*
1c640 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c650 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
1c660 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46  dle the SQLITE_F
1c670 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a  CNTL_SIZE_HINT .
1c680 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ** file-control 
1c690 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61  operation.  Enla
1c6a0 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rge the database
1c6b0 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69   to nBytes in si
1c6c0 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75  ze.** (rounded u
1c6d0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68  p to the next ch
1c6e0 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74  unk-size).  If t
1c6f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1c700 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73  lready.** nBytes
1c710 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73   or larger, this
1c720 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c730 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1c740 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74  nt fcntlSizeHint
1c750 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1c760 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
1c770 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
1c780 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20  nk>0 ){.    i64 
1c790 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
1c7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
1c7b0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1c7c0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
1c7d0 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  at buf;         
1c7e0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1c7f0 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75  hold return valu
1c800 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f  es of fstat() */
1c810 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46  .   .    if( osF
1c820 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
1c830 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51  buf) ) return SQ
1c840 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1c850 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  ;..    nSize = (
1c860 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a  (nByte+pFile->sz
1c870 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65  Chunk-1) / pFile
1c880 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
1c890 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20  le->szChunk;.   
1c8a0 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29   if( nSize>(i64)
1c8b0 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a  buf.st_size ){..
1c8c0 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
1c8d0 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1c8e0 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
1c8f0 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20  FALLOCATE.      
1c900 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f  /* The code belo
1c910 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68  w is handling th
1c920 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1c930 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20  f osFallocate() 
1c940 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
1c950 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  tly. posix_fallo
1c960 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65  cate() is define
1c970 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65  d to "returns ze
1c980 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a  ro on success, .
1c990 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65        ** or an e
1c9a0 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20  rror number on  
1c9b0 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68  failure". See th
1c9c0 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65  e manpage for de
1c9d0 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1c9e0 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64  int err;.      d
1c9f0 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d  o{.        err =
1ca00 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69   osFallocate(pFi
1ca10 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69  le->h, buf.st_si
1ca20 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74  ze, nSize-buf.st
1ca30 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77  _size);.      }w
1ca40 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52  hile( err==EINTR
1ca50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72   );.      if( er
1ca60 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
1ca70 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23  E_IOERR_WRITE;.#
1ca80 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66  else.      /* If
1ca90 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74   the OS does not
1caa0 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c   have posix_fall
1cab0 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74  ocate(), fake it
1cac0 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20  . First use.    
1cad0 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29    ** ftruncate()
1cae0 20 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65   to set the file
1caf0 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74   size, then writ
1cb00 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  e a single byte 
1cb10 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1cb20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
1cb30 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74  h block within t
1cb40 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69  he extended regi
1cb50 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  on. This.      *
1cb60 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65  * is the same te
1cb70 63 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20  chnique used by 
1cb80 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65  glibc to impleme
1cb90 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  nt posix_falloca
1cba0 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  te().      ** on
1cbb0 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f   systems that do
1cbc0 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c   not have a real
1cbd0 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73   fallocate() sys
1cbe0 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20  tem call..      
1cbf0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c  */.      int nBl
1cc00 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69  k = buf.st_blksi
1cc10 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73  ze;  /* File-sys
1cc20 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a  tem block size *
1cc30 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69  /.      i64 iWri
1cc40 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1cc50 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
1cc60 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  et to write to *
1cc70 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  /..      if( rob
1cc80 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1cc90 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29  ile->h, nSize) )
1cca0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1ccb0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1ccc0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
1ccd0 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1cce0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1ccf0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1cd00 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1cd10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cd20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1cd30 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1cd40 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1cd50 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  -1;.      while(
1cd60 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b   iWrite<nSize ){
1cd70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72  .        int nWr
1cd80 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1cd90 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
1cda0 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
1cdb0 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
1cdc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1cdd0 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1cde0 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e       iWrite += n
1cdf0 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Blk;.      }.#en
1ce00 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
1ce10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ce20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  K;.}../*.** If *
1ce30 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61  pArg is inititia
1ce40 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
1ce50 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
1ce60 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
1ce70 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
1ce80 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1ce90 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
1cea0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1ceb0 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
1cec0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
1ced0 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
1cee0 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
1cef0 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
1cf00 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
1cf10 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64  tic void unixMod
1cf20 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  eBit(unixFile *p
1cf30 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  File, unsigned c
1cf40 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70  har mask, int *p
1cf50 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72  Arg){.  if( *pAr
1cf60 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67  g<0 ){.    *pArg
1cf70 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46   = (pFile->ctrlF
1cf80 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b  lags & mask)!=0;
1cf90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70  .  }else if( (*p
1cfa0 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Arg)==0 ){.    p
1cfb0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1cfc0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73  &= ~mask;.  }els
1cfd0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  e{.    pFile->ct
1cfe0 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b  rlFlags |= mask;
1cff0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  .  }.}../* Forwa
1d000 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
1d010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d020 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
1d030 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1d040 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  f);../*.** Infor
1d050 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1d060 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1d070 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1d080 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1d090 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1d0a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1d0b0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1d0c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1d0d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1d0e0 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  d;.  switch( op 
1d0f0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1d100 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
1d110 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
1d120 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
1d130 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
1d140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d150 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1d160 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
1d170 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
1d180 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
1d190 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1d1a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d1b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d1c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1d1d0 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
1d1e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
1d1f0 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
1d200 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Arg;.      retur
1d210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d220 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1d230 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1d240 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  NT: {.      int 
1d250 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  rc;.      Simula
1d260 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1d270 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  1);.      rc = f
1d280 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69  cntlSizeHint(pFi
1d290 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67  le, *(i64 *)pArg
1d2a0 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1d2b0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1d2c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d2d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  rc;.    }.    ca
1d2e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1d2f0 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1d300 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1d310 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1d320 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1d330 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1d340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d350 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1d360 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1d370 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1d380 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  TE: {.      unix
1d390 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1d3a0 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  NIXFILE_PSOW, (i
1d3b0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1d3c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d3d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1d3e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
1d3f0 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
1d400 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1d410 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1d420 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
1d430 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
1d440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d450 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1d460 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1d470 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1d480 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1d490 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
1d4a0 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d  oc( pFile->pVfs-
1d4b0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
1d4c0 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20       if( zTFile 
1d4d0 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47  ){.        unixG
1d4e0 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
1d4f0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d500 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20  me, zTFile);.   
1d510 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
1d520 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
1d530 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1d540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1d550 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1d560 54 45 5f 46 43 4e 54 4c 5f 47 45 54 46 44 3a 20  TE_FCNTL_GETFD: 
1d570 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1d580 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  Arg = pFile->h;.
1d590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d5a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1d5b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1d5c0 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1d5d0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1d5e0 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1d5f0 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1d600 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1d610 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1d620 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1d630 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1d640 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1d650 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1d660 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d670 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1d680 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1d690 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1d6a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1d6b0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1d6c0 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1d6d0 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1d6e0 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1d6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d700 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1d710 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d720 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1d730 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1d740 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1d750 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
1d760 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  YFILE:.    case 
1d770 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
1d780 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
1d790 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
1d7a0 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
1d7b0 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
1d7c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1d7d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1d7e0 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1d7f0 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
1d800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d810 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
1d820 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1d830 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
1d840 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
1d850 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
1d860 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
1d870 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
1d880 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
1d890 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
1d8a0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
1d8b0 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
1d8c0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
1d8d0 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
1d8e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
1d8f0 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
1d900 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
1d910 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
1d920 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
1d930 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
1d940 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
1d950 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
1d960 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
1d970 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
1d980 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1d990 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
1d9a0 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66  for both..*/.#if
1d9b0 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  ndef __QNXNTO__ 
1d9c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d9d0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1d9e0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
1d9f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1da00 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
1da10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1da20 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1da30 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  IZE;.}.#endif../
1da40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1da50 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e  ng version of un
1da60 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  ixSectorSize() i
1da70 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20  s optimized for 
1da80 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  QNX..*/.#ifdef _
1da90 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75  _QNXNTO__.#inclu
1daa0 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
1dab0 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
1dac0 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
1dad0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1dae0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1daf0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
1db00 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1db10 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1db20 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1db30 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
1db40 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
1db50 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
1db60 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
1db70 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
1db80 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
1db90 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
1dba0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1dbb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1dbc0 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
1dbd0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1dbe0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
1dbf0 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
1dc00 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
1dc10 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
1dc20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
1dc30 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1dc40 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72   }..    if( !str
1dc50 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1dc60 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20  etype, "tmp") ) 
1dc70 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1dc80 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1dc90 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1dca0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1dcb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1dcc0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1dcd0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c  IOCAP_ATOMIC4K |
1dce0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61         /* All ra
1dcf0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  m filesystem wri
1dd00 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
1dd10 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1dd20 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1dd30 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1dd40 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1dd50 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1dd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1dd90 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1dda0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1ddb0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1ddc0 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1ddd0 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1dde0 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1de20 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1de30 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1de40 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49  e if( strstr(fsI
1de50 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1de60 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20  "etfs") ){.     
1de70 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1de80 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1de90 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1dea0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1deb0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1dec0 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65    /* etfs cluste
1ded0 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61 72  r size writes ar
1dee0 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
1def0 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74      (pFile->sect
1df00 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
1df10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1df20 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20  IC512) |.       
1df30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1df40 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1df50 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1df60 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1df70 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1dfa0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1dfb0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1dfc0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1dfd0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1dfe0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1dff0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1e000 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1e030 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1e040 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1e050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74     }else if( !st
1e060 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
1e070 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20  setype, "qnx6") 
1e080 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
1e090 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
1e0a0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
1e0b0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1e0c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1e0d0 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
1e0e0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20  _IOCAP_ATOMIC | 
1e0f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66          /* All f
1e100 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
1e110 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1e120 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1e130 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1e140 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1e150 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1e160 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1e1a0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1e1b0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1e1c0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1e1d0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1e1e0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1e1f0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1e230 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1e240 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1e250 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1e260 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
1e270 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx4") ){.      p
1e280 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e290 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1e2a0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1e2b0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1e2c0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1e2d0 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
1e2e0 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
1e2f0 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
1e300 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
1e310 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
1e320 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1e330 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1e340 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
1e350 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
1e360 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1e370 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1e380 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1e390 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1e3a0 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1e3d0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1e3e0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1e3f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
1e400 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
1e410 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a  type, "dos") ){.
1e420 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1e430 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1e440 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1e450 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1e460 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1e470 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1e480 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1e490 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1e4a0 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1e4b0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1e4c0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e4d0 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1e4e0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1e4f0 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1e500 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1e510 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1e520 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1e530 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1e540 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1e580 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1e590 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    0;.    }else{.
1e5a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1e5b0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1e5c0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1e5d0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1e5e0 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c  512 |      /* bl
1e5f0 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ocks are atomic 
1e600 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1e610 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1e620 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1e630 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1e640 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1e650 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
1e680 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1e690 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1e6a0 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20  }.  }.  /* Last 
1e6b0 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61 74  chance verificat
1e6c0 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
1e6d0 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61  tor size isn't a
1e6e0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32   multiple of 512
1e6f0 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
1e700 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69  n't valid.*/.  i
1e710 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1e720 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20  Size % 512 != 0 
1e730 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  ){.    pFile->de
1e740 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1e750 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ics = 0;.    pFi
1e760 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1e770 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1e780 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1e790 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
1e7a0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23  >sectorSize;.}.#
1e7b0 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54  endif /* __QNXNT
1e7c0 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  O__ */../*.** Re
1e7d0 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
1e7e0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e7f0 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  for the file..**
1e800 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73 20  .** This VFS is 
1e810 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e  set up to return
1e820 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1e830 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e840 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a  E by default..**
1e850 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63   However, that c
1e860 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 61 76  hoice is contrav
1e870 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63  ersial since tec
1e880 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64  hnically the und
1e890 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20  erlying.** file 
1e8a0 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
1e8b0 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20 70  always provide p
1e8c0 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72 69  owersafe overwri
1e8d0 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a  tes.  (In other.
1e8e0 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20  ** words, after 
1e8f0 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65  a power-loss eve
1e900 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65  nt, parts of the
1e910 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 20   file that were 
1e920 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e  never.** written
1e930 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
1e940 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48  ing altered.)  H
1e950 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57  owever, non-PSOW
1e960 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65 72   behavior is ver
1e970 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e  y,.** very rare.
1e980 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20    And asserting 
1e990 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72  PSOW makes a lar
1e9a0 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20  ge reduction in 
1e9b0 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
1e9c0 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f   required I/O fo
1e9d0 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69  r journaling, si
1e9e0 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64  nce a lot of pad
1e9f0 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74  ding is eliminat
1ea00 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77  ed..**  Hence, w
1ea10 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f  hile POWERSAFE_O
1ea20 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62  VERWRITE is on b
1ea30 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65  y default, there
1ea40 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72   is a file-contr
1ea50 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ol.** available 
1ea60 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61  to turn it off a
1ea70 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61 72  nd URI query par
1ea80 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65  ameter available
1ea90 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e   to turn it off.
1eaa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1eab0 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
1eac0 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
1ead0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
1eae0 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
1eaf0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1eb00 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20   rc = 0;.#ifdef 
1eb10 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28  __QNXNTO__.  if(
1eb20 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d   p->sectorSize==
1eb30 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69  0 ) unixSectorSi
1eb40 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70  ze(id);.  rc = p
1eb50 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1eb60 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a  ristics;.#endif.
1eb70 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61    if( p->ctrlFla
1eb80 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53  gs & UNIXFILE_PS
1eb90 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20  OW ){.    rc |= 
1eba0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1ebb0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1ebc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ebd0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1ebe0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a  LITE_OMIT_WAL...
1ebf0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
1ec00 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1ec10 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
1ec20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20  buffer.  .**.** 
1ec30 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
1ec40 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
1ec50 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c  nce the same wal
1ec60 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72  -index, each thr
1ec70 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f  ead.** has its o
1ec80 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  wn unixShm objec
1ec90 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20  t, but they all 
1eca0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
1ecb0 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  e instance.** of
1ecc0 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1ecd0 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  e object.  In ot
1ece0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20  her words, each 
1ecf0 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65  wal-index is ope
1ed00 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65  ned.** only once
1ed10 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1ed20 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d  .** Each unixShm
1ed30 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63  Node object is c
1ed40 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69  onnected to a si
1ed50 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ngle unixInodeIn
1ed60 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65  fo object..** We
1ed70 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20   could coalesce 
1ed80 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f  this object into
1ed90 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20   unixInodeInfo, 
1eda0 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  but that would m
1edb0 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65  ean.** every ope
1edc0 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73  n file that does
1edd0 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20   not use shared 
1ede0 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72  memory (in other
1edf0 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20   words, most.** 
1ee00 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c  open files) woul
1ee10 64 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20  d have to carry 
1ee20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72  around this extr
1ee30 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  a information.  
1ee40 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e  So.** the unixIn
1ee50 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  odeInfo object c
1ee60 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1ee70 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68  r to this unixSh
1ee80 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  mNode object.** 
1ee90 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  and the unixShmN
1eea0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  ode object is cr
1eeb0 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20  eated only when 
1eec0 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e  needed..**.** un
1eed0 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  ixMutexHeld() mu
1eee0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
1eef0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
1ef00 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
1ef10 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
1ef20 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1ef30 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1ef40 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
1ef50 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68     nRef.**.** Th
1ef60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1ef70 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
1ef80 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
1ef90 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
1efa0 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
1efb0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1efc0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
1efd0 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  xShmNode.mutex m
1efe0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
1eff0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  nixShmNode.nRef=
1f000 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
1f010 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1f020 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1f030 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1f040 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1f050 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1f060 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
1f070 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e  mNode {.  unixIn
1f080 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
1f090 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64       /* unixInod
1f0a0 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20  eInfo that owns 
1f0b0 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f  this SHM node */
1f0c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f0d0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
1f0e0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
1f0f0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1f100 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1f110 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1f120 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70  Name of the mmap
1f130 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
1f140 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1f150 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1f160 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1f170 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1f180 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1f190 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1f1a0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1f1b0 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69  s */.  u16 nRegi
1f1c0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1f1d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1f1e0 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1f1f0 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20   u8 isReadonly; 
1f200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f210 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79  rue if read-only
1f220 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52   */.  char **apR
1f230 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1f240 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70   /* Array of map
1f250 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ped shared-memor
1f260 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
1f270 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1f280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f290 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f  ber of unixShm o
1f2a0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1f2b0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69  to this */.  uni
1f2c0 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20  xShm *pFirst;   
1f2d0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75          /* All u
1f2e0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
1f2f0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
1f300 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1f310 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
1f320 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1f330 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1f340 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1f350 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
1f360 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1f370 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
1f380 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
1f390 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
1f3a0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
1f3b0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
1f3c0 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61  le unixShm.id va
1f3d0 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
1f3e0 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
1f3f0 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
1f400 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
1f410 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
1f420 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
1f430 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
1f440 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1f450 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
1f460 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
1f470 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
1f480 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
1f490 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
1f4a0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
1f4b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53  :.**.**    unixS
1f4c0 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75  hm.pFile.**    u
1f4d0 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  nixShm.id.**.** 
1f4e0 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
1f4f0 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
1f500 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46    The unixShm.pF
1f510 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
1f520 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
1f530 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
1f540 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
1f550 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
1f560 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e  Shm {.  unixShmN
1f570 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1f580 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1f590 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ying unixShmNode
1f5a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69   object */.  uni
1f5b0 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  xShm *pNext;    
1f5c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1f5d0 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68 65  unixShm with the
1f5e0 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64   same unixShmNod
1f5f0 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
1f600 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1f610 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
1f620 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d  ding the unixShm
1f630 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
1f640 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
1f650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
1f660 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1f670 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75  ion within its u
1f680 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
1f690 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
1f6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f6b0 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1f6c0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
1f6d0 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
1f6e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1f6f0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1f700 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f  ks held */.};../
1f710 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
1f720 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
1f730 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
1f740 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
1f750 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1f760 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20  )*4)         /* 
1f770 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
1f780 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
1f790 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58  SHM_DMS    (UNIX
1f7a0 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
1f7b0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
1f7c0 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
1f7d0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70  /../*.** Apply p
1f7e0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
1f7f0 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  cks for all byte
1f800 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f  s from ofst thro
1f810 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a  ugh ofst+n-1..**
1f820 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
1f830 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
1f840 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f  xactly UNIX_SHM_
1f850 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c  C and are non-bl
1f860 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77  ocking.** otherw
1f870 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1f880 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  nt unixShmSystem
1f890 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e  Lock(.  unixShmN
1f8a0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f  ode *pShmNode, /
1f8b0 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1f8c0 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1f8d0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1f8e0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1f8f0 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe,          /* 
1f900 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
1f910 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
1f920 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1f930 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1f940 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f  t byte of the lo
1f950 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20  cking range */. 
1f960 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20   int n          
1f970 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f980 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
1f990 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ck */.){.  struc
1f9a0 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20  t flock f;      
1f9b0 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64   /* The posix ad
1f9c0 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73  visory locking s
1f9d0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
1f9e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f9f0 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f  ;   /* Result co
1fa00 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20  de form fcntl() 
1fa10 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
1fa20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  to the unixShmNo
1fa30 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
1fa40 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
1fa50 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
1fa60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1fa70 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
1fa80 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
1fa90 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
1faa0 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
1fab0 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
1fac0 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
1fad0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
1fae0 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
1faf0 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
1fb00 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
1fb10 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
1fb20 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51  rt( n>=1 && n<SQ
1fb30 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1fb40 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
1fb50 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
1fb60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1fb70 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
1fb80 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
1fb90 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
1fba0 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
1fbb0 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
1fbc0 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
1fbd0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
1fbe0 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
1fbf0 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
1fc00 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1fc10 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
1fc20 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20  _SETLK, &f);.   
1fc30 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
1fc40 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
1fc50 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
1fc60 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1fc70 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
1fc80 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
1fc90 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
1fca0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1fcb0 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
1fcc0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1fcd0 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
1fce0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
1fcf0 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28  (1<<ofst);.  if(
1fd00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fd10 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
1fd20 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
1fd30 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
1fd40 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  nlock %d ok", of
1fd50 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
1fd60 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
1fd70 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1fd80 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
1fd90 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1fda0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
1fdb0 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
1fdc0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1fdd0 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b  "read-lock %d ok
1fde0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
1fdf0 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1fe00 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1fe10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
1fe20 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1fe30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fe40 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
1fe50 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
1fe60 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1fe70 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b  write-lock %d ok
1fe80 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
1fe90 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
1fea0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1feb0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
1fec0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1fed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1fee0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
1fef0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
1ff00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
1ff10 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
1ff20 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c   ofst));.    }el
1ff30 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
1ff40 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
1ff50 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
1ff60 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b  -lock failed"));
1ff70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ff80 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
1ff90 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
1ffa0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
1ffb0 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69  rite-lock %d fai
1ffc0 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
1ffd0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
1ffe0 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64  E((" - afterward
1fff0 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  s %03x,%03x\n",.
20000 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
20010 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  ode->sharedMask,
20020 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
20030 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ask));.  }.#endi
20040 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  f..  return rc; 
20050 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a         .}.../*.*
20060 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
20070 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
20080 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
20090 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
200a0 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
200b0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
200c0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
200d0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
200e0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
200f0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
20100 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
20110 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
20120 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
20130 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
20140 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
20150 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
20160 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
20170 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
20180 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
20190 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d  ( p && p->nRef==
201a0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
201b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
201c0 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
201d0 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
201e0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
201f0 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
20200 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
20210 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
20220 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
20230 20 20 20 20 20 20 6d 75 6e 6d 61 70 28 70 2d 3e        munmap(p->
20240 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
20250 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
20260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20270 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
20280 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
20290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
202a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
202b0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
202c0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
202d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
202e0 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
202f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
20300 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
20310 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
20320 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
20330 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
20340 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
20350 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
20360 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
20370 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
20380 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
20390 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
203a0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
203b0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
203c0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
203d0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
203e0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
203f0 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
20400 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
20410 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
20420 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
20430 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
20440 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
20450 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
20460 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
20470 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
20480 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
20490 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
204a0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
204b0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
204c0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
204d0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
204e0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
204f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
20500 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
20510 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
20520 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
20530 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
20540 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
20550 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
20560 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
20570 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
20580 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
20590 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
205a0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
205b0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
205c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
205d0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
205e0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
205f0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
20600 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
20610 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
20620 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
20630 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
20640 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
20650 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
20660 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
20670 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
20680 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
20690 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
206a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
206b0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
206c0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
206d0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
206e0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
206f0 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
20700 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
20710 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
20720 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
20730 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
20740 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
20750 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
20760 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
20770 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
20780 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
20790 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
207a0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
207b0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
207c0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
207d0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
207e0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
207f0 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
20800 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
20810 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
20820 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
20830 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
20840 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
20850 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
20860 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
20870 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
20880 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
20890 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
208a0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
208b0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
208c0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
208d0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
208e0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
208f0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
20900 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
20910 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
20920 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
20930 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
20940 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
20950 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
20960 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
20970 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
20980 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
20990 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
209a0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
209b0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
209c0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
209d0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
209e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
209f0 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
20a00 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
20a10 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
20a20 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
20a30 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
20a40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20a50 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
20a60 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
20a70 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
20a80 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
20a90 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
20aa0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
20ab0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
20ac0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
20ad0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
20ae0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
20af0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
20b00 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
20b10 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
20b20 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
20b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20b40 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
20b50 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
20b60 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
20b70 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
20b80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
20b90 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
20ba0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
20bb0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
20bc0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
20bd0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
20be0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
20bf0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
20c20 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
20c30 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
20c40 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
20c50 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
20c60 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
20c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20c80 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
20c90 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
20ca0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
20cb0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
20cc0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
20cd0 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
20ce0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
20cf0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
20d00 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
20d10 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
20d20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
20d30 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
20d40 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
20d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
20d60 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
20d70 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
20d80 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
20d90 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
20da0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
20db0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
20dc0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
20dd0 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
20de0 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
20df0 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
20e00 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
20e10 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
20e20 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
20e30 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
20e40 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
20e50 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
20e60 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
20e70 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
20e80 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
20e90 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
20ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
20eb0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
20ec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20ed0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
20ee0 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
20ef0 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
20f00 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
20f10 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
20f20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
20f30 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
20f40 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
20f50 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
20f60 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
20f70 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
20f80 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  sions..    */.  
20f90 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
20fa0 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
20fb0 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
20fc0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
20fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20fe0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
20ff0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
21000 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
21010 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
21020 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
21030 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
21040 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
21050 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
21060 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
21070 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
21080 29 73 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a  )strlen(pDbFd->z
21090 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Path);.#endif.  
210a0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c    pShmNode = sql
210b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
210c0 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
210d0 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b   nShmFilename );
210e0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
210f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
21100 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21110 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
21120 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
21130 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e      memset(pShmN
21140 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ode, 0, sizeof(*
21150 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69  pShmNode)+nShmFi
21160 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68  lename);.    zSh
21170 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d  mFilename = pShm
21180 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
21190 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
211a0 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
211b0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
211c0 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
211d0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
211e0 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
211f0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
21200 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21210 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22  _SHM_DIRECTORY "
21220 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25  /sqlite-shm-%x-%
21230 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
21240 20 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53           (u32)sS
21250 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32  tat.st_ino, (u32
21260 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a  )sStat.st_dev);.
21270 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65  #else.    sqlite
21280 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
21290 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c  ilename, zShmFil
212a0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
212b0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
212c0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
212d0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
212e0 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ath, zShmFilenam
212f0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  e);.#endif.    p
21300 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
21310 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f  .    pDbFd->pIno
21320 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de->pShmNode = p
21330 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68  ShmNode;.    pSh
21340 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20  mNode->pInode = 
21350 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
21360 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
21370 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
21380 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
21390 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
213a0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
213b0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
213c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
213d0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
213e0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
213f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
21400 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
21410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
21420 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
21430 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
21440 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21450 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62  _uri_boolean(pDb
21460 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64  Fd->zPath, "read
21470 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b  only_shm", 0) ){
21480 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
21490 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
214a0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
214b0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
214c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
214d0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
214e0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
214f0 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
21500 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
21510 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
21520 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
21530 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21540 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
21550 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
21560 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
21570 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
21580 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
21590 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
215a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
215b0 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
215c0 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65  ng as root, make
215d0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53   sure that the S
215e0 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  HM file.      **
215f0 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65   is owned by the
21600 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20   same user that 
21610 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61  owns the origina
21620 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68  l database.  Oth
21630 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
21640 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77   the original ow
21650 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ner will not be 
21660 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e  able to connect.
21670 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21680 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64  osFchown(pShmNod
21690 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75  e->h, sStat.st_u
216a0 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64  id, sStat.st_gid
216b0 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43  );.  .      /* C
216c0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
216d0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
216e0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
216f0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
21700 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20       ** If not, 
21710 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
21720 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
21730 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
21740 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21750 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
21760 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
21770 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c  hmNode, F_WRLCK,
21780 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
21790 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
217a0 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
217b0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
217c0 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
217d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
217e0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
217f0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
21800 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
21810 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
21820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21850 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
21860 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
21870 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  de, F_RDLCK, UNI
21880 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
21890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
218a0 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
218b0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
218c0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
218d0 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
218e0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
218f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
21900 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
21910 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
21920 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
21930 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
21940 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
21950 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
21960 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
21970 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e  ->pShm = p;.  un
21980 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
21990 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
219a0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
219b0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
219c0 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
219d0 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
219e0 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75  e cover of the u
219f0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
21a00 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
21a10 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
21a20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
21a30 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20  unixShm) object 
21a40 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
21a50 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
21a60 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
21a70 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
21a80 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
21a90 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
21aa0 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
21ab0 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
21ac0 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
21ad0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
21ae0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
21af0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
21b00 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
21b10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
21b20 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
21b30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
21b40 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
21b50 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
21b60 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
21b70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21b80 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
21b90 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
21ba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
21bb0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
21bc0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
21bd0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69  _open_err:.  uni
21be0 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
21bf0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ;       /* This 
21c00 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
21c10 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
21c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
21c30 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  e(p);.  unixLeav
21c40 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
21c50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21c60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21c70 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
21c80 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
21c90 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
21ca0 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
21cb0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
21cc0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
21cd0 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
21ce0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
21cf0 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
21d00 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
21d10 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
21d20 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
21d30 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
21d40 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
21d50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21d60 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
21d70 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21d80 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
21d90 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
21da0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
21db0 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72   the bExtend par
21dc0 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
21dd0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
21de0 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
21df0 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
21e00 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
21e10 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
21e20 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
21e30 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
21e40 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
21e50 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
21e60 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
21e70 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21e80 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20   .** bExtend is 
21e90 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
21ea0 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
21eb0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
21ec0 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
21ed0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
21ee0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
21ef0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
21f00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
21f10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21f20 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
21f30 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
21f40 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
21f50 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
21f60 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
21f70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
21f80 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
21f90 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
21fa0 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
21fb0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
21fc0 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
21fd0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
21fe0 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
21ff0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
22000 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
22010 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70  c int unixShmMap
22020 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
22030 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
22040 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
22050 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
22060 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
22070 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
22080 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22090 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
220a0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
220b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
220c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
220d0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
220e0 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20  bExtend,        
220f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22100 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
22110 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
22120 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
22130 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
22140 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
22150 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
22160 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
22170 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
22180 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  fd;.  unixShm *p
22190 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ;.  unixShmNode 
221a0 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
221b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
221c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
221d0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
221e0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
221f0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
22200 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
22210 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
22220 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
22230 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
22240 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
22250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
22270 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
22280 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
22290 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
222a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
222b0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
222c0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
222d0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
222e0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
222f0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
22300 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22310 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
22320 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
22330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
22340 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
22350 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
22360 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
22370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
22380 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
22390 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
223a0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
223b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
223c0 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
223d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
223e0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
223f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22400 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
22410 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
22420 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
22430 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
22440 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
22450 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
22460 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
22470 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
22480 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
22490 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
224a0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
224b0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
224c0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
224d0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
224e0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
224f0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
22500 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
22510 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
22520 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
22530 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
22540 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
22550 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
22560 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
22570 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
22580 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
22590 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
225a0 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
225b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
225c0 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
225d0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
225e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
225f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
22600 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
22610 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
22620 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
22630 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
22640 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
22650 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
22660 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
22670 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
22680 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
22690 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
226a0 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
226b0 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
226c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
226d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
226e0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ned..        **.
226f0 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72          ** Alter
22700 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78  natively, if bEx
22710 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73  tend is true, us
22720 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
22730 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
22740 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
22750 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
22760 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22770 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
22780 64 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  d ) goto shmpage
22790 5f 6f 75 74 3b 0a 23 69 66 20 64 65 66 69 6e 65  _out;.#if define
227a0 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
227b0 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
227c0 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
227d0 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 46 61          if( osFa
227e0 6c 6c 6f 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  llocate(pShmNode
227f0 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 73 69  ->h, sStat.st_si
22800 7a 65 2c 20 6e 42 79 74 65 29 21 3d 30 20 29 7b  ze, nByte)!=0 ){
22810 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22820 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
22830 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
22840 45 2c 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 0a  E, "fallocate",.
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
22870 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
22880 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
22890 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
228a0 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
228b0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
228c0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
228d0 6f 64 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ode->h, nByte) )
228e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
228f0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
22900 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
22910 5a 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  ZE, "ftruncate",
22920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68               pSh
22940 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
22950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
22960 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
22970 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
22980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22990 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
229a0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
229b0 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
229c0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
229d0 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
229e0 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a  apNew = (char **
229f0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
22a00 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
22a10 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69  de->apRegion, (i
22a20 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
22a30 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a  (char *).    );.
22a40 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
22a50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22a60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22a70 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
22a80 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
22a90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52     pShmNode->apR
22aa0 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20  egion = apNew;. 
22ab0 20 20 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64     while(pShmNod
22ac0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
22ad0 69 6f 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  ion){.      void
22ae0 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66   *pMem;.      if
22af0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
22b00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
22b10 20 3d 20 6d 6d 61 70 28 30 2c 20 73 7a 52 65 67   = mmap(0, szReg
22b20 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
22b30 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
22b40 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41  donly ? PROT_REA
22b50 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  D : PROT_READ|PR
22b60 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20  OT_WRITE, .     
22b70 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45         MAP_SHARE
22b80 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  D, pShmNode->h, 
22b90 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53  szRegion*(i64)pS
22ba0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a  hmNode->nRegion.
22bb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
22bc0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
22bd0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
22be0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
22bf0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
22c00 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
22c10 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
22c20 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
22c30 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22c40 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
22c50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22c60 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
22c70 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67  te3_malloc(szReg
22c80 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
22c90 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
22ca0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22cb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22cc0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22cd0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
22ce0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
22cf0 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
22d00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22d10 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
22d20 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
22d30 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
22d40 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
22d50 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
22d60 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
22d70 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
22d80 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
22d90 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
22da0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
22db0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
22dc0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
22dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
22de0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
22df0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22e00 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
22e10 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
22e20 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22e30 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
22e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22e50 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
22e60 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
22e70 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
22e80 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
22e90 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
22ea0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
22eb0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
22ec0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
22ed0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
22ee0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
22ef0 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
22f00 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
22f10 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
22f20 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
22f30 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
22f40 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
22f50 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
22f60 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
22f70 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
22f80 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
22f90 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
22fa0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
22fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
22fc0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
22fd0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
22fe0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
22ff0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
23000 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
23010 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
23020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23030 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
23040 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
23050 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
23060 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
23070 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23080 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
23090 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
230a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
230d0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
230e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
230f0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
23100 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
23110 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
23120 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
23130 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
23140 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
23150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23160 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
23170 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
23180 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
231b0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
231c0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
231d0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
231e0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
231f0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
23200 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
23210 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
23220 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
23230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
23240 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
23250 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
23280 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
23290 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
232a0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
232b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
232c0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
232d0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
232e0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
232f0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
23300 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
23310 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
23320 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
23330 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
23340 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
23350 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
23360 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
23370 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
23380 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
23390 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
233a0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
233b0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
233c0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
233d0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
233e0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
233f0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
23400 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
23410 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
23420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
23430 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
23440 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
23450 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
23460 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
23470 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
23480 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
23490 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
234a0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
234b0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
234c0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
234d0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
234e0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
234f0 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
23500 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
23510 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
23520 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23530 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
23540 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
23550 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
23560 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
23570 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
23580 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
23590 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
235a0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
235b0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
235c0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
235d0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
235e0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
235f0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
23600 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
23610 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
23620 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
23630 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
23640 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
23650 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
23660 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
23670 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
23680 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
23690 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
236a0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
236b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
236c0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
236d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
236e0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
236f0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
23700 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
23710 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
23720 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
23730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23740 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
23750 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
23760 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
23770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23780 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
23790 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
237a0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
237b0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
237c0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
237d0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
237e0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
237f0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
23800 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
23810 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
23820 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
23830 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
23840 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
23850 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
23860 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
23870 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
23880 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
23890 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
238a0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
238b0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
238c0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
238d0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
238e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
238f0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
23900 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
23910 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
23920 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
23930 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
23940 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23950 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
23960 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
23970 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
23980 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
23990 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
239a0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
239b0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
239c0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
239d0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
239e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
239f0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
23a00 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
23a10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23a20 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
23a30 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
23a40 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
23a50 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
23a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23a90 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
23aa0 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
23ab0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
23ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23ad0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
23ae0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
23af0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23b00 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
23b10 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
23b20 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
23b30 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
23b40 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
23b50 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
23b60 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
23b70 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
23b80 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
23b90 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
23ba0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
23bb0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
23bc0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
23bd0 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
23be0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
23bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
23c00 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
23c10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
23c30 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
23c40 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
23c50 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
23c60 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
23c70 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
23c80 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
23c90 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
23ca0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
23cb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
23cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23cd0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
23ce0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
23cf0 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
23d00 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
23d10 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
23d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23d30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23d40 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
23d50 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
23d60 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
23d70 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
23d80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
23d90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
23da0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
23db0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
23dc0 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
23dd0 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
23de0 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
23df0 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
23e00 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
23e10 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
23e20 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
23e30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
23e40 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
23e50 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
23e60 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
23e70 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
23e80 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
23e90 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
23ea0 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
23eb0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
23ec0 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
23ed0 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
23ee0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
23ef0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
23f00 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
23f10 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
23f20 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
23f30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
23f40 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
23f50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
23f60 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
23f70 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
23f80 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
23f90 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
23fa0 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
23fb0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
23fc0 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
23fd0 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
23fe0 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
23ff0 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
24000 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
24010 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
24020 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
24030 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24040 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
24050 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
24060 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
24070 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
24080 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
24090 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
240a0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
240b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
240c0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
240d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
240e0 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
240f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
24100 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
24110 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
24120 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
24150 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
24160 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
24170 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
24180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
24190 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
241a0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
241b0 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
241e0 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
241f0 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
24200 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24220 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
24230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24240 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
24250 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
24260 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
24270 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
24280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24290 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
242a0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
242b0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
242c0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
242d0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
242e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
242f0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
24300 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
24310 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
24320 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
24330 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
24340 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
24350 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
24360 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
24370 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
24380 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
24390 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
243a0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
243b0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
243c0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
243d0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
243e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
243f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24400 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
24410 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
24420 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
24430 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
24440 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
24450 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
24460 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
24470 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
24480 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
24490 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
244a0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
244b0 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
244c0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
244d0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
244e0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
244f0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
24500 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
24510 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
24520 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b  >h>=0 ) osUnlink
24530 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
24540 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53  name);.    unixS
24550 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
24560 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
24570 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
24580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24590 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
245a0 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
245b0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
245c0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
245d0 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
245e0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
245f0 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
24600 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
24610 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
24620 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d   */../*.** Argum
24630 65 6e 74 73 20 78 20 61 6e 64 20 79 20 61 72 65  ents x and y are
24640 20 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2e 20   both integers. 
24650 41 72 67 75 6d 65 6e 74 20 79 20 6d 75 73 74 20  Argument y must 
24660 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e  be a power of 2.
24670 0a 2a 2a 20 52 6f 75 6e 64 20 78 20 75 70 20 74  .** Round x up t
24680 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 69 6e  o the nearest in
24690 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
246a0 66 20 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  f y. For example
246b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 55 4e  :.**.**     ROUN
246c0 44 55 50 28 30 2c 20 20 38 29 20 2d 3e 20 20 30  DUP(0,  8) ->  0
246d0 0a 2a 2a 20 20 20 20 20 52 4f 55 4e 44 55 50 28  .**     ROUNDUP(
246e0 31 33 2c 20 38 29 20 2d 3e 20 31 36 0a 2a 2a 20  13, 8) -> 16.** 
246f0 20 20 20 20 52 4f 55 4e 44 55 50 28 33 32 2c 20      ROUNDUP(32, 
24700 38 29 20 2d 3e 20 33 32 0a 2a 2f 0a 23 64 65 66  8) -> 32.*/.#def
24710 69 6e 65 20 52 4f 55 4e 44 55 50 28 78 2c 79 29  ine ROUNDUP(x,y)
24720 20 20 20 20 20 28 28 28 78 29 2b 79 2d 31 29 26       (((x)+y-1)&
24730 7e 28 79 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 4d  ~(y-1))../*.** M
24740 61 70 2c 20 72 65 6d 61 70 20 6f 72 20 75 6e 6d  ap, remap or unm
24750 61 70 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ap part of the d
24760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
24770 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24780 4d 72 65 6d 61 70 28 0a 20 20 73 71 6c 69 74 65  Mremap(.  sqlite
24790 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
247a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
247b0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
247c0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
247f0 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 58 58  SQLITE_MREMAP_XX
24800 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
24810 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 2c  ite3_int64 iOff,
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24830 4f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  Offset to start 
24840 6d 61 70 70 69 6e 67 20 61 74 20 2a 2f 0a 20 20  mapping at */.  
24850 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4f  sqlite3_int64 nO
24860 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
24870 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 6c 64 20 6d  /* Size of old m
24880 61 70 70 69 6e 67 2c 20 6f 72 20 7a 65 72 6f 20  apping, or zero 
24890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
248a0 36 34 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20  64 nNew,        
248b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
248c0 6e 65 77 20 6d 61 70 70 69 6e 67 2c 20 6f 72 20  new mapping, or 
248d0 7a 65 72 6f 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  zero */.  void *
248e0 2a 70 70 4d 61 70 20 20 20 20 20 20 20 20 20 20  *ppMap          
248f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
24900 4f 55 54 3a 20 4f 6c 64 2f 6e 65 77 20 6d 61 70  OUT: Old/new map
24910 70 69 6e 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e  pings */.){.  un
24920 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
24930 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
24940 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
24950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24960 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24970 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
24980 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
24990 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4e 65  e */.  void *pNe
249a0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
249b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6d 61         /* New ma
249c0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
249d0 4e 65 77 52 6e 64 3b 20 20 20 20 20 20 20 20 20  NewRnd;         
249e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 4e             /* nN
249f0 65 77 20 72 6f 75 6e 64 65 64 20 75 70 20 2a 2f  ew rounded up */
24a00 0a 20 20 69 36 34 20 6e 4f 6c 64 52 6e 64 3b 20  .  i64 nOldRnd; 
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 2f 2a 20 6e 4f 6c 64 20 72 6f 75 6e 64     /* nOld round
24a30 65 64 20 75 70 20 2a 2f 0a 0a 20 20 61 73 73 65  ed up */..  asse
24a40 72 74 28 20 69 4f 66 66 3d 3d 30 20 29 3b 0a 0a  rt( iOff==0 );..
24a50 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
24a60 54 45 5f 4d 52 45 4d 41 50 5f 45 58 54 45 4e 44  TE_MREMAP_EXTEND
24a70 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
24a80 65 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  en the size of t
24a90 68 65 20 72 65 71 75 65 73 74 65 64 20 0a 20 20  he requested .  
24aa0 2a 2a 20 6d 61 70 70 69 6e 67 20 28 6e 4e 65 77  ** mapping (nNew
24ab0 20 62 79 74 65 73 29 20 6d 61 79 20 62 65 20 67   bytes) may be g
24ac0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
24ad0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
24ae0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20  base file..  ** 
24af0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
24b00 61 73 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20  ase, extend the 
24b10 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 75 73 69  file on disk usi
24b20 6e 67 20 66 74 72 75 6e 63 61 74 65 28 29 2e 20  ng ftruncate(). 
24b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   */.  assert( nN
24b40 65 77 3e 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  ew>0 || (flags &
24b50 20 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 45   SQLITE_MREMAP_E
24b60 58 54 45 4e 44 29 3d 3d 30 20 29 3b 0a 20 20 69  XTEND)==0 );.  i
24b70 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
24b80 45 5f 4d 52 45 4d 41 50 5f 45 58 54 45 4e 44 20  E_MREMAP_EXTEND 
24b90 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
24ba0 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
24bb0 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
24bc0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
24bd0 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f  on */.    rc = o
24be0 73 46 73 74 61 74 28 70 2d 3e 68 2c 20 26 73 74  sFstat(p->h, &st
24bf0 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
24c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24c10 20 6e 4e 65 77 3e 73 74 61 74 62 75 66 2e 73 74   nNew>statbuf.st
24c20 5f 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  _size ){.      r
24c30 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
24c40 63 61 74 65 28 70 2d 3e 68 2c 20 6e 4e 65 77 29  cate(p->h, nNew)
24c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24c60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24c70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24c80 20 20 2f 2a 20 41 63 63 6f 72 64 69 6e 67 20 74    /* According t
24c90 6f 20 73 6f 6d 65 20 73 6f 75 72 63 65 73 2c 20  o some sources, 
24ca0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 63 68  the effect of ch
24cb0 61 6e 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20  anging the size 
24cc0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 64 65  of the.  ** unde
24cd0 72 6c 79 69 6e 67 20 66 69 6c 65 20 6f 6e 20 6d  rlying file on m
24ce0 61 70 70 65 64 20 72 65 67 69 6f 6e 73 20 74 68  apped regions th
24cf0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
24d00 20 74 68 65 20 61 64 64 65 64 20 6f 72 0a 20 20   the added or.  
24d10 2a 2a 20 72 65 6d 6f 76 65 64 20 70 61 67 65 73  ** removed pages
24d20 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 48   is undefined. H
24d30 6f 77 65 76 65 72 2c 20 74 68 65 72 65 20 69 73  owever, there is
24d40 20 72 65 61 73 6f 6e 20 74 6f 20 62 65 6c 69 65   reason to belie
24d50 76 65 20 74 68 61 74 0a 20 20 2a 2a 20 6f 6e 20  ve that.  ** on 
24d60 6d 6f 64 65 72 6e 20 70 6c 61 74 66 6f 72 6d 73  modern platforms
24d70 20 6c 69 6b 65 20 4c 69 6e 75 78 20 6f 72 20 4f   like Linux or O
24d80 53 58 2c 20 74 68 69 6e 67 73 20 6a 75 73 74 20  SX, things just 
24d90 77 6f 72 6b 2e 20 46 6f 72 20 65 78 61 6d 70 6c  work. For exampl
24da0 65 2c 0a 20 20 2a 2a 20 69 74 20 69 73 20 70 6f  e,.  ** it is po
24db0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
24dc0 20 61 20 6d 61 70 70 69 6e 67 20 6c 61 72 67 65   a mapping large
24dd0 72 20 74 68 61 6e 20 74 68 65 20 66 69 6c 65 20  r than the file 
24de0 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 2a 2a  on disk and.  **
24df0 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
24e00 20 6f 6e 20 64 69 73 6b 20 6c 61 74 65 72 20 6f   on disk later o
24e10 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 70  n..  **.  ** Exp
24e20 6c 6f 69 74 20 74 68 69 73 20 6f 6e 20 4c 69 6e  loit this on Lin
24e30 75 78 20 61 6e 64 20 4f 53 58 20 74 6f 20 72 65  ux and OSX to re
24e40 64 75 63 65 20 74 68 65 20 6e 75 6d 62 65 72 20  duce the number 
24e50 6f 66 20 6d 75 6e 6d 61 70 28 29 2f 6d 6d 61 70  of munmap()/mmap
24e60 28 29 20 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 72  () .  ** calls r
24e70 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 66  equired if the f
24e80 69 6c 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  ile size is chan
24e90 67 69 6e 67 2e 20 49 6e 20 74 68 69 73 20 63 61  ging. In this ca
24ea0 73 65 20 61 6c 6c 20 6d 61 70 70 69 6e 67 73 20  se all mappings 
24eb0 0a 20 20 2a 2a 20 61 72 65 20 72 6f 75 6e 64 65  .  ** are rounde
24ec0 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 61 72  d up to the near
24ed0 65 73 74 20 34 4d 42 2e 20 41 6e 64 20 69 66 20  est 4MB. And if 
24ee0 61 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 69 73  a new mapping is
24ef0 20 72 65 71 75 65 73 74 65 64 20 0a 20 20 2a 2a   requested .  **
24f00 20 74 68 61 74 20 68 61 73 20 74 68 65 20 73 61   that has the sa
24f10 6d 65 20 72 6f 75 6e 64 65 64 20 73 69 7a 65 20  me rounded size 
24f20 61 73 20 61 6e 20 6f 6c 64 20 6d 61 70 70 69 6e  as an old mappin
24f30 67 2c 20 74 68 65 20 6f 6c 64 20 6d 61 70 70 69  g, the old mappi
24f40 6e 67 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  ng can .  ** be 
24f50 72 65 75 73 65 64 20 61 73 20 69 73 2e 20 2a 2f  reused as is. */
24f60 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
24f70 50 50 4c 45 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  PPLE__) || defin
24f80 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20  ed(__linux__).  
24f90 6e 4e 65 77 52 6e 64 20 3d 20 52 4f 55 4e 44 55  nNewRnd = ROUNDU
24fa0 50 28 6e 4e 65 77 2c 20 34 30 39 36 2a 31 30 32  P(nNew, 4096*102
24fb0 34 29 3b 0a 20 20 6e 4f 6c 64 52 6e 64 20 3d 20  4);.  nOldRnd = 
24fc0 52 4f 55 4e 44 55 50 28 6e 4f 6c 64 2c 20 34 30  ROUNDUP(nOld, 40
24fd0 39 36 2a 31 30 32 34 29 3b 0a 23 65 6c 73 65 0a  96*1024);.#else.
24fe0 20 20 6e 4e 65 77 52 6e 64 20 3d 20 52 4f 55 4e    nNewRnd = ROUN
24ff0 44 55 50 28 6e 4e 65 77 2c 20 34 30 39 36 2a 31  DUP(nNew, 4096*1
25000 29 3b 0a 20 20 6e 4f 6c 64 52 6e 64 20 3d 20 52  );.  nOldRnd = R
25010 4f 55 4e 44 55 50 28 6e 4f 6c 64 2c 20 34 30 39  OUNDUP(nOld, 409
25020 36 2a 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  6*1);.#endif..  
25030 2f 2a 20 4f 6e 20 4f 53 58 20 6f 72 20 4c 69 6e  /* On OSX or Lin
25040 75 78 2c 20 72 65 75 73 65 20 74 68 65 20 6f 6c  ux, reuse the ol
25050 64 20 6d 61 70 70 69 6e 67 20 69 66 20 69 74 20  d mapping if it 
25060 69 73 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  is the right siz
25070 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
25080 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
25090 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
250a0 5f 29 0a 20 20 69 66 28 20 6e 4e 65 77 52 6e 64  _).  if( nNewRnd
250b0 3d 3d 6e 4f 6c 64 52 6e 64 20 29 7b 0a 20 20 20  ==nOldRnd ){.   
250c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
250d0 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  K;.  }.#endif.. 
250e0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
250f0 69 73 20 66 61 72 2c 20 75 6e 6d 61 70 20 61 6e  is far, unmap an
25100 79 20 6f 6c 64 20 6d 61 70 70 69 6e 67 2e 20 2a  y old mapping. *
25110 2f 0a 20 20 69 66 28 20 6e 4f 6c 64 52 6e 64 21  /.  if( nOldRnd!
25120 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  =0 ){.    void *
25130 70 4f 6c 64 20 3d 20 2a 70 70 4d 61 70 3b 0a 20  pOld = *ppMap;. 
25140 20 20 20 6d 75 6e 6d 61 70 28 70 4f 6c 64 2c 20     munmap(pOld, 
25150 6e 4f 6c 64 52 6e 64 29 3b 0a 20 20 7d 0a 0a 20  nOldRnd);.  }.. 
25160 20 2f 2a 20 41 6e 64 2c 20 69 66 20 72 65 71 75   /* And, if requ
25170 69 72 65 64 2c 20 75 73 65 20 6d 6d 61 70 28 29  ired, use mmap()
25180 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
25190 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
251a0 66 28 20 6e 4e 65 77 52 6e 64 3e 30 20 29 7b 0a  f( nNewRnd>0 ){.
251b0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
251c0 50 52 4f 54 5f 52 45 41 44 3b 0a 20 20 20 20 69  PROT_READ;.    i
251d0 66 28 20 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73  f( (p->ctrlFlags
251e0 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
251f0 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c  LY)==0 ) flags |
25200 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 20 20  = PROT_WRITE;.  
25210 20 20 70 4e 65 77 20 3d 20 6d 6d 61 70 28 30 2c    pNew = mmap(0,
25220 20 6e 4e 65 77 52 6e 64 2c 20 66 6c 61 67 73 2c   nNewRnd, flags,
25230 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 2d 3e   MAP_SHARED, p->
25240 68 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 69 66  h, iOff);.    if
25250 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c  ( pNew==MAP_FAIL
25260 45 44 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ED ){.      pNew
25270 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
25280 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 52   SQLITE_IOERR_MR
25290 45 4d 41 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EMAP;.    }.  }.
252a0 0a 20 20 2a 70 70 4d 61 70 20 3d 20 70 4e 65 77  .  *ppMap = pNew
252b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
252c0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
252d0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
252e0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
252f0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
25300 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
25310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
25320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
25330 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
25340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25350 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
25360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
253a0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
253b0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
253c0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
253d0 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
253e0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
253f0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
25400 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
25410 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
25420 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
25430 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
25440 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
25450 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
25460 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
25470 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
25480 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
25490 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
254a0 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
254b0 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
254c0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
254d0 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
254e0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
254f0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
25500 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
25510 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
25520 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
25530 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
25540 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
25550 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
25560 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
25570 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
25580 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
25590 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
255a0 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
255b0 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
255c0 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
255d0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
255e0 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
255f0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
25600 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
25610 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
25620 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
25630 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
25640 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
25650 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f  r-funtion F, two
25660 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
25670 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ated:.**.**    (
25680 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64  1) The real find
25690 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er-function name
256a0 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a  d "FImpt()"..**.
256b0 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73  **    (2) A cons
256c0 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tant pointer to 
256d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61  this function na
256e0 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a  med just "F"..**
256f0 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
25700 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65   to the F pointe
25710 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  r is used as the
25720 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20   pAppData value 
25730 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63  for VFS.** objec
25740 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  ts.  We have to 
25750 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20  do this instead 
25760 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44  of letting pAppD
25770 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72  ata point.** dir
25780 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e  ectly at the fin
25790 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e  der-function sin
257a0 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65  ce C90 rules pre
257b0 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20  vent a void*.** 
257c0 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74  from be cast int
257d0 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  o a function poi
257e0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45  nter..**.**.** E
257f0 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ach instance of 
25800 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72  this macro gener
25810 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73  ates two objects
25820 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63  :.**.**   *  A c
25830 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f  onstant sqlite3_
25840 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
25850 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68  t call METHOD th
25860 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a  at has locking.*
25870 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43  *      methods C
25880 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
25890 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a  CK, CKRESLOCK..*
258a0 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f  *.**   *  An I/O
258b0 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
258c0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46  unction called F
258d0 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72  INDER that retur
258e0 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
258f0 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48       to the METH
25900 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  OD object in the
25910 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74   previous bullet
25920 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d  ..*/.#define IOM
25930 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d  ETHODS(FINDER, M
25940 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20  ETHOD, VERSION, 
25950 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
25960 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20  OCK, CKLOCK)    
25970 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
25980 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
25990 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20  ods METHOD = {  
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259c0 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20   \.   VERSION,  
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a10 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20  \.   CLOSE,     
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20   /* xClose */   
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25a60 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20  .   unixRead,   
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20  /* xRead */     
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
25ab0 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20     unixWrite,   
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ad0 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20  * xWrite */     
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
25b00 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20    unixTruncate, 
25b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b20 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20   xTruncate */   
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
25b50 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20   unixSync,      
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b70 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20  xSync */        
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
25ba0 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20  unixFileSize,   
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25bc0 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20  FileSize */     
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c            \.   L
25bf0 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
25c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
25c10 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e           \.   UN
25c40 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
25c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
25c60 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  lock */         
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c          \.   CKL
25c90 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
25ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
25cb0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
25cc0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
25cd0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
25ce0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
25cf0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
25d00 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20  Control */      
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
25d30 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
25d40 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
25d50 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  rSize */        
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d70 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65       \.   unixDe
25d80 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25d90 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65  ics,  /* xDevice
25da0 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20  Capabilities */ 
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dc0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
25dd0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
25de0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
25df0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e10 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c     \.   unixShmL
25e20 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
25e30 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
25e40 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61    \.   unixShmBa
25e70 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
25e80 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
25e90 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25eb0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d   \.   unixShmUnm
25ec0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
25ed0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
25ee0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f00 5c 0a 20 20 20 75 6e 69 78 4d 72 65 6d 61 70 2c  \.   unixMremap,
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 2f 2a 20 78 4d 72 65 6d 61 70 20 2a 2f 20 20   /* xMremap */  
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25f50 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
25fa0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
25fb0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
25fc0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
25fd0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
25fe0 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
25ff0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26000 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
26010 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
26040 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260d0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
260e0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
260f0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
26100 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
26110 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
26120 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
26130 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
26140 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
26150 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
26160 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
26170 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
26180 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
26190 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
261a0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
261b0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
261c0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
261d0 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
261e0 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
261f0 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
26200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26210 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
26220 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
26230 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
26240 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
26250 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
26260 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
26290 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72  mory and mmap ar
262a0 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  e enabled */.  u
262b0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
262c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
262d0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
262e0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
262f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
26300 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
26310 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
26320 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
26330 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
26340 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
26350 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
26360 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
26370 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
26380 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
26390 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
263a0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
263b0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
263c0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
263d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
263e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
263f0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
26400 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
26410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
26420 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
26430 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
26440 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
26450 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
26460 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
26470 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
26480 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
26490 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
264a0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
264b0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
264c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
264d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
264e0 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
264f0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
26500 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
26510 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
26520 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
26530 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
26540 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
26550 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
26560 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
26570 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
26580 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
265b0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
265c0 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
265d0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
265e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
265f0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
26600 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
26610 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
26620 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
26630 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
26640 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
26650 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
26660 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
26670 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
26680 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
26690 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
266a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
266b0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
266c0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
266d0 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
266e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
266f0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
26700 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
26710 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
26720 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
26730 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
26740 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
26770 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
26780 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
26790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
267a0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
267b0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
267e0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
267f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26800 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
26810 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
26820 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
26830 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
26840 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
26850 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
26860 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
26870 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
26880 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26890 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
268a0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
268b0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
268c0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
268d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
268e0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
26910 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
26920 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  bled */.  semClo
26930 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
26940 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
26950 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
26960 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
26970 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
26980 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
26990 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
269a0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
269b0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
269c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
269d0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
269e0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
269f0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
26a00 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
26a10 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
26a20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
26a30 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
26a40 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
26a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26a60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
26a70 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
26a80 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
26a90 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
26aa0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
26ab0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
26ae0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
26af0 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b10 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
26b20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b40 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
26b50 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b70 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
26b80 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
26b90 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
26ba0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
26bb0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
26bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
26bd0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
26be0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
26bf0 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
26c00 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
26c10 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
26c20 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
26c30 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
26c40 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
26c50 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
26c60 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
26c70 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
26c80 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
26c90 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
26ca0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
26cb0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
26cc0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
26cd0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
26ce0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
26cf0 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
26d00 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
26d10 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
26d20 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
26d30 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
26d40 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
26d50 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
26d60 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
26d70 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
26d80 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
26d90 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
26da0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
26db0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
26dc0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
26dd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
26de0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
26df0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
26e00 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
26e10 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
26e20 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
26e30 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
26e40 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
26e50 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
26e60 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
26e70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
26e80 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
26e90 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
26ea0 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
26eb0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
26ec0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
26ed0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
26ee0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
26ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
26f00 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
26f10 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
26f20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
26f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
26f40 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
26f50 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
26f60 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
26f70 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
26f80 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
26f90 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
26fa0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
26fb0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
26fc0 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
26fd0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
26fe0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
26ff0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
27000 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
27010 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
27020 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
27030 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
27040 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
27050 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
27060 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
27070 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
27080 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
27090 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
270a0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
270b0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
270c0 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
270e0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
270f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
27100 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
27110 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
27120 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27130 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27150 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
27160 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
27170 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
27180 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
27190 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
271a0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
271b0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
271c0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
271d0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
271e0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
271f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
27200 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
27210 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
27220 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
27230 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
27240 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
27250 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
27260 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
27270 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27280 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
27290 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
272a0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
272b0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
272c0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
272d0 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
272e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
272f0 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
27300 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
27310 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27320 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
27330 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
27340 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
27350 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
27360 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
27370 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
27380 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
27390 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
273a0 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
273b0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
273c0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
273d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
273e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
273f0 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
27400 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
27410 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
27420 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
27430 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
27440 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
27450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
27460 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
27470 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
27480 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
27490 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
274a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
274b0 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
274c0 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
274d0 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
274e0 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
274f0 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
27500 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
27510 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
27520 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
27530 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
27540 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
27550 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
27560 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
27570 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
27580 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
27590 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
275a0 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
275b0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
275c0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
275d0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
275e0 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
275f0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
27600 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
27610 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
27620 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
27630 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
27640 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
27650 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
27660 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
27670 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
27680 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
27690 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
276a0 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
276b0 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
276c0 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
276d0 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
276e0 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
276f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
27700 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
27710 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
27720 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
27730 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
27740 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
27750 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
27760 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
27770 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
27780 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
27790 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
277a0 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
277b0 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
277c0 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
277d0 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
277e0 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
277f0 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
27800 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
27810 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
27820 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
27830 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
27840 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
27850 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
27860 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
27870 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
27880 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
27890 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
278a0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
278b0 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
278c0 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
278d0 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
278e0 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
278f0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
27900 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
27910 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
27920 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27930 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
27940 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
27950 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
27960 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
27970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
27980 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
27990 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
279a0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
279b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
279c0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
279d0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
279e0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
279f0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
27a00 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
27a10 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
27a20 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
27a30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
27a40 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
27a50 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
27a60 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
27a70 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
27a80 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
27a90 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
27aa0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
27ab0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
27ac0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
27ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27ae0 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
27af0 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
27b00 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
27b10 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
27b20 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
27b30 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
27b40 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
27b50 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
27b60 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
27b70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27b80 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
27b90 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
27ba0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
27bb0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
27bc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27bd0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
27be0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
27bf0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
27c00 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
27c10 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
27c20 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
27c30 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
27c40 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
27c50 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
27c60 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
27c70 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
27c80 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
27c90 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
27ca0 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
27cb0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
27cc0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
27cd0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
27ce0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
27cf0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
27d00 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
27d10 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
27d20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
27d30 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
27d40 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
27d50 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
27d60 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
27d70 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
27d80 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
27d90 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
27da0 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
27db0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
27dc0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
27dd0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
27de0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
27df0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
27e00 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
27e10 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
27e20 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
27e30 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
27e40 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
27e50 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
27e60 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
27e70 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
27e80 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
27e90 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
27ea0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
27eb0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
27ec0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
27ed0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
27ee0 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
27ef0 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
27f00 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
27f10 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
27f20 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
27f30 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
27f40 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
27f50 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
27f60 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
27f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27fb0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
27fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
27fd0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
27fe0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
27ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28000 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
28010 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
28020 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28030 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
28040 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
28050 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
28060 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
28070 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
28080 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
28090 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
280a0 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
280b0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
280c0 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
280d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
280e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
280f0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
28100 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
28110 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
28120 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
28130 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
28140 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
28150 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
28160 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
28170 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
28180 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
28190 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
281a0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
281b0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
281c0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
281d0 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
281e0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
281f0 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
28200 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
28210 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
28220 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
28230 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
28240 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
28250 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
28260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
28280 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
28290 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
282a0 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
282b0 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
282c0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
282d0 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
282e0 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
282f0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
28300 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
28310 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
28320 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
28330 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
28340 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
28350 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
28360 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
28370 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
28380 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
28390 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
283a0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
283b0 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
283c0 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
283d0 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
283e0 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
283f0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
28400 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
28410 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
28420 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
28430 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
28440 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
28450 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
28460 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74  lename!=0 || (ct
28470 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
28480 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b  LE_NOLOCK)!=0 );
28490 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
284a0 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
284b0 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
284c0 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
284d0 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20  .  pNew->pVfs = 
284e0 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  pVfs;.  pNew->zP
284f0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
28500 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61  .  pNew->ctrlFla
28510 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61  gs = (u8)ctrlFla
28520 67 73 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  gs;.  if( sqlite
28530 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28  3_uri_boolean(((
28540 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
28550 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c  FILE_URI) ? zFil
28560 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20  ename : 0),.    
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53         "psow", S
28590 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
285a0 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
285b0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
285c0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53  s |= UNIXFILE_PS
285d0 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  OW;.  }.  if( st
285e0 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  rcmp(pVfs->zName
285f0 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30  ,"unix-excl")==0
28600 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
28610 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
28620 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23  ILE_EXCL;.  }..#
28630 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
28640 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
28650 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
28660 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
28670 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
28680 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
28690 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
286a0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
286b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
286c0 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46  dif..  if( ctrlF
286d0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
286e0 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c  NOLOCK ){.    pL
286f0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e  ockingStyle = &n
28700 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
28710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
28720 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a  ckingStyle = (**
28730 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56  (finder_type*)pV
28740 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46  fs->pAppData)(zF
28750 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a  ilename, pNew);.
28760 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
28770 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
28780 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69      /* Cache zFi
28790 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f  lename in the lo
287a0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41  cking context (A
287b0 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f  FP and dotlock o
287c0 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20  verride) for.   
287d0 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63   ** proxyLock ac
287e0 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73  tivation is poss
287f0 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f  ible (remote pro
28800 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64  xy is based on d
28810 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a  b name).    ** z
28820 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73  Filename remains
28830 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c   valid until fil
28840 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20  e is closed, to 
28850 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70  support */.    p
28860 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
28870 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69  ext = (void*)zFi
28880 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  lename;.#endif. 
28890 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69   }..  if( pLocki
288a0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69  ngStyle == &posi
288b0 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64  xIoMethods.#if d
288c0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
288d0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
288e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
288f0 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67  .    || pLocking
28900 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d  Style == &nfsIoM
28910 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20  ethods.#endif.  
28920 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ){.    unixEnter
28930 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
28940 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
28950 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
28960 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ode);.    if( rc
28970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28980 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72       /* If an er
28990 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66  ror occured in f
289a0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
289b0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
289c0 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
289d0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
289e0 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
289f0 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
28a00 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
28a10 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
28a20 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
28a30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
28a40 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
28a50 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
28a60 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
28a70 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
28a80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
28a90 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
28aa0 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
28ab0 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
28ac0 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
28ad0 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
28ae0 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
28af0 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
28b00 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
28b10 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
28b20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
28b30 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
28b40 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
28b50 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
28b60 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
28b70 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
28b80 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
28b90 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
28ba0 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
28bb0 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
28bc0 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
28bd0 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
28be0 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
28bf0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
28c00 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
28c10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
28c20 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
28c30 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
28c40 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
28c50 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
28c60 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
28c70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
28c80 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
28c90 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
28ca0 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
28cb0 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
28cc0 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
28cd0 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
28ce0 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
28cf0 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
28d00 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
28d10 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
28d20 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
28d30 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
28d40 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
28d50 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
28d60 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28d70 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
28d80 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
28d90 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
28da0 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
28db0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
28dc0 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
28dd0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
28de0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
28df0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
28e00 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
28e10 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
28e20 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
28e30 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
28e40 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
28e50 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
28e60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
28e70 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29   sizeof(*pCtx) )
28e80 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d  ;.    if( pCtx==
28e90 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
28ea0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
28ec0 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
28ed0 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
28ee0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
28ef0 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
28f00 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
28f10 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
28f20 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
28f30 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
28f40 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
28f50 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
28f60 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
28f70 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
28f80 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
28f90 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20   pCtx->reserved 
28fa0 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  = 0;.      srand
28fb0 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
28fc0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
28fd0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
28fe0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
28ff0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
29000 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29020 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29030 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
29040 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  text);.        r
29050 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
29060 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
29070 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
29080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
29090 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
290a0 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
290b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
290c0 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
290d0 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
290e0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
290f0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
29100 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
29110 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
29120 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
29130 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
29140 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
29150 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
29160 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
29170 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
29180 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  me;.    assert( 
29190 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
291a0 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
291b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
291c0 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
291d0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
291e0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
291f0 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  oc(nFilename);. 
29200 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
29210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
29220 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29240 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
29250 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
29260 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
29270 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
29280 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
29290 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
292a0 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
292b0 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
292c0 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
292d0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
292e0 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
292f0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
29300 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
29310 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
29320 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
29330 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
29340 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
29350 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
29360 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
29370 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
29380 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
29390 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
293a0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
293b0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
293c0 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
293d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
293e0 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
293f0 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
29400 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
29410 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
29420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29430 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
29440 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
29450 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
29460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29470 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
29480 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
29490 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
294a0 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
294b0 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
294c0 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
294d0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
294e0 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
294f0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
29500 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
29510 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
29520 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
29530 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
29540 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
29550 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
29560 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
29570 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
29580 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
29590 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
295a0 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
295b0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
295c0 23 65 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77  #endif.  .  pNew
295d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
295e0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
295f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29600 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
29610 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
29620 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
29630 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
29640 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  1;.    osUnlink(
29650 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
29660 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20  isDelete = 0;.  
29670 7d 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  }.  if( isDelete
29680 20 29 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61   ) pNew->ctrlFla
29690 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
296a0 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  ELETE;.#endif.  
296b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
296c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
296d0 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
296e0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
296f0 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  __);.  }else{.  
29700 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
29710 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
29720 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
29730 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (+1);.  }.  retu
29740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29750 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
29760 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
29770 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
29780 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
29790 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
297a0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
297b0 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
297c0 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
297d0 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
297e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
297f0 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
29800 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
29810 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
29820 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
29830 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
29840 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
29850 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
29860 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20  p",.     0      
29870 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
29880 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75  ator */.  };.  u
29890 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
298a0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
298b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
298c0 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44  zDir = 0;..  azD
298d0 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
298e0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
298f0 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
29900 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
29910 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
29920 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
29930 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
29940 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
29950 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
29960 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
29970 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
29980 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
29990 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
299a0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
299b0 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
299c0 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
299d0 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
299e0 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
299f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
29a00 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
29a10 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
29a20 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
29a30 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
29a40 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
29a50 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
29a60 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
29a70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
29a80 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
29a90 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
29aa0 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
29ab0 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
29ac0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
29ad0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
29ae0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
29af0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e   static const un
29b00 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61  signed char zCha
29b10 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
29b20 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
29b30 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
29b40 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
29b50 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
29b60 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73  23456789";.  uns
29b70 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a  igned int i, j;.
29b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
29b90 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  ir;..  /* It's o
29ba0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
29bb0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
29bc0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
29bd0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
29be0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
29bf0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
29c00 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
29c10 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
29c20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
29c30 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
29c40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
29c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29c60 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
29c70 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
29c80 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d  r();.  if( zDir=
29c90 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b  =0 ) zDir = ".";
29ca0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
29cb0 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
29cc0 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
29cd0 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
29ce0 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
29cf0 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
29d00 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
29d10 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
29d20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69   if( (strlen(zDi
29d30 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49  r) + strlen(SQLI
29d40 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
29d50 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73  FIX) + 18) >= (s
29d60 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20  ize_t)nBuf ){.  
29d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29d80 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f  ERROR;.  }..  do
29d90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
29da0 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20  printf(nBuf-18, 
29db0 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54  zBuf, "%s/"SQLIT
29dc0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
29dd0 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
29de0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
29df0 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
29e00 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
29e10 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
29e20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
29e30 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
29e40 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
29e50 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
29e60 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
29e70 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
29e80 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
29e90 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
29ea0 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
29eb0 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63  .  }while( osAcc
29ec0 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
29ed0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29ee0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
29ef0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29f00 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
29f10 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
29f20 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
29f30 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
29f40 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
29f50 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
29f60 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
29f70 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
29f80 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
29f90 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
29fa0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
29fb0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
29fc0 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
29fd0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
29fe0 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
29ff0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
2a000 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
2a010 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
2a020 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
2a030 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2a040 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
2a050 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
2a060 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2a070 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
2a080 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
2a090 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
2a0a0 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
2a0b0 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
2a0c0 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
2a0d0 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
2a0e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2a0f0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
2a100 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2a110 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
2a120 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
2a130 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
2a140 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a150 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
2a160 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
2a170 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
2a180 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
2a190 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
2a1a0 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
2a1b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2a1c0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2a1d0 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
2a1e0 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
2a1f0 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
2a200 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
2a210 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
2a220 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
2a230 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
2a240 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
2a250 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
2a260 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2a270 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
2a280 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
2a290 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
2a2a0 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
2a2b0 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
2a2c0 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
2a2d0 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
2a2e0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
2a2f0 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
2a300 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
2a310 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
2a320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
2a330 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
2a340 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
2a350 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
2a360 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
2a370 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2a380 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
2a390 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
2a3a0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2a3b0 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
2a3c0 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
2a3d0 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
2a3e0 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
2a3f0 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
2a400 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
2a410 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
2a420 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
2a430 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
2a440 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
2a450 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
2a460 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
2a470 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
2a480 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
2a490 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
2a4a0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
2a4b0 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
2a4c0 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2a4d0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2a4e0 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2a4f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2a500 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
2a510 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74   */..  /* A stat
2a520 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c  () call may fail
2a530 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61   for various rea
2a540 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61  sons. If this ha
2a550 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a  ppens, it is.  *
2a560 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  * almost certain
2a570 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20   that an open() 
2a580 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65  call on the same
2a590 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20   path will also 
2a5a0 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74  fail..  ** For t
2a5b0 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61  his reason, if a
2a5c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
2a5d0 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c  n the stat() cal
2a5e0 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20  l here, it is.  
2a5f0 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d  ** ignored and -
2a600 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  1 is returned. T
2a610 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74  he caller will t
2a620 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ry to open a new
2a630 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72   file.  ** descr
2a640 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  iptor on the sam
2a650 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e  e path, fail, an
2a660 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  d return an erro
2a670 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a  r to SQLite..  *
2a680 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61  *.  ** Even if a
2a690 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e   subsequent open
2a6a0 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63  () call does suc
2a6b0 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71  ceed, the conseq
2a6c0 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e  uences of.  ** n
2a6d0 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  ot searching for
2a6e0 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c   a resusable fil
2a6f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2a700 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
2a710 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2a720 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2a730 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2a740 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2a750 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2a760 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
2a770 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2a780 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2a790 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2a7a0 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2a7b0 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2a7c0 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2a7d0 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
2a7e0 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
2a7f0 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
2a800 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
2a810 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
2a820 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
2a830 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
2a840 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
2a850 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
2a860 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
2a870 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
2a880 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
2a890 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
2a8a0 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
2a8b0 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2a8c0 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2a8d0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2a8e0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2a8f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2a900 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
2a910 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
2a920 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
2a930 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2a940 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2a950 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
2a960 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2a970 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
2a980 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
2a990 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
2a9a0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2a9b0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2a9c0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
2a9d0 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
2a9e0 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
2a9f0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
2aa00 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
2aa10 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
2aa20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
2aa30 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2aa40 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
2aa50 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
2aa60 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2aa70 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
2aa80 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
2aa90 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61  **.** In most ca
2aaa0 73 65 73 20 63 61 73 65 73 2c 20 74 68 69 73 20  ses cases, this 
2aab0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
2aac0 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
2aad0 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
2aae0 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
2aaf0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
2ab00 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
2ab10 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
2ab20 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2ab30 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
2ab40 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
2ab50 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
2ab60 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2ab70 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
2ab80 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2ab90 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
2aba0 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
2abb0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
2abc0 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
2abd0 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
2abe0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
2abf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2ac00 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
2ac10 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
2ac20 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
2ac30 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
2ac40 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
2ac50 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
2ac60 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
2ac70 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
2ac80 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2ac90 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
2aca0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2acb0 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
2acc0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
2acd0 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
2ace0 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
2acf0 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
2ad00 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
2ad10 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
2ad20 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
2ad30 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
2ad40 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
2ad50 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
2ad60 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
2ad70 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
2ad80 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
2ad90 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
2ada0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2adb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2adc0 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
2add0 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
2ade0 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
2adf0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae10 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
2ae20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
2ae30 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
2ae40 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae60 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
2ae70 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
2ae80 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
2ae90 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
2aea0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2aeb0 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
2aec0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
2aed0 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2aef0 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
2af00 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
2af10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2af20 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2af30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2af40 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
2af50 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
2af60 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
2af70 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2af80 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2af90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2afa0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
2afb0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
2afc0 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
2afd0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
2afe0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b010 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
2b020 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
2b030 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2b040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2b050 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
2b060 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2b070 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
2b080 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
2b090 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
2b0a0 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
2b0b0 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
2b0c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
2b0d0 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
2b0e0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2b0f0 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
2b100 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
2b110 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
2b120 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
2b130 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
2b140 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2b150 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
2b160 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2b170 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
2b180 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2b190 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
2b1a0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2b1b0 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
2b1c0 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
2b1d0 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20  NN is a decimal 
2b1e0 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e  number. The NN n
2b1f0 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  aming schemes ar
2b200 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
2b210 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69  y the test_multi
2b220 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20  plex.c module.. 
2b230 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20     */.    nDb = 
2b240 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2b250 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66  zPath) - 1; .#if
2b260 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2b270 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20  E_8_3_NAMES.    
2b280 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20  while( nDb>0 && 
2b290 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
2b2a0 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62  Path[nDb]) ) nDb
2b2b0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
2b2c0 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
2b2d0 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53  !='-' ) return S
2b2e0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
2b2f0 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
2b300 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
2b310 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e      assert( nDb>
2b320 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2b330 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  t( zPath[nDb]!='
2b340 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62  \n' );.      nDb
2b350 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  --;.    }.#endif
2b360 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
2b370 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
2b380 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
2b390 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
2b3a0 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
2b3b0 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
2b3c0 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
2b3d0 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20  de & 0777;.     
2b3e0 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
2b3f0 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47  t_uid;.      *pG
2b400 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
2b410 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
2b420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b430 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
2b440 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
2b450 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2b460 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2b470 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
2b480 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74   0600;.  }.  ret
2b490 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b4a0 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
2b4b0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
2b4c0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
2b4d0 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
2b4e0 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
2b4f0 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
2b500 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
2b510 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2b520 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
2b530 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2b540 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
2b550 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2b560 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
2b570 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
2b580 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
2b590 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
2b5a0 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
2b5b0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
2b5c0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
2b5d0 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
2b5e0 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
2b5f0 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
2b600 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
2b610 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
2b620 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
2b630 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
2b640 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
2b650 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
2b660 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
2b670 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
2b680 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
2b690 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
2b6a0 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
2b6b0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
2b6c0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
2b6d0 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
2b6e0 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
2b6f0 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
2b700 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
2b710 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
2b720 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
2b730 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
2b740 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
2b750 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
2b760 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
2b770 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
2b780 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
2b790 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2b7a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2b7b0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
2b7c0 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
2b7d0 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
2b7e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2b7f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
2b800 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
2b810 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
2b820 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2b830 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
2b840 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
2b850 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
2b860 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
2b870 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2b880 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2b890 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
2b8a0 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
2b8b0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
2b8c0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2b8d0 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
2b8e0 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
2b8f0 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
2b900 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
2b910 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
2b920 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2b950 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
2b960 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
2b970 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
2b980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b990 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
2b9a0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2b9b0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
2b9c0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
2b9d0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
2b9e0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
2b9f0 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2ba00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2ba10 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
2ba20 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
2ba30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ba40 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
2ba50 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
2ba60 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
2ba70 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  trlFlags = 0;   
2ba80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
2ba90 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
2baa0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
2bab0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
2bac0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2bad0 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
2bae0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
2baf0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2bb00 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
2bb10 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
2bb20 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2bb30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2bb40 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
2bb50 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
2bb60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2bb70 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
2bb80 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
2bb90 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2bba0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
2bbb0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2bbc0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2bbd0 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
2bbe0 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
2bbf0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2bc00 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
2bc10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2bc20 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
2bc30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2bc40 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
2bc50 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
2bc60 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
2bc70 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
2bc80 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
2bc90 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
2bca0 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
2bcb0 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
2bcc0 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
2bcd0 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
2bce0 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
2bcf0 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
2bd00 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
2bd10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2bd20 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
2bd30 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
2bd40 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
2bd50 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
2bd60 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
2bd70 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2bd80 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2bd90 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2bda0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2bdb0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
2bdc0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2bdd0 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
2bde0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
2bdf0 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
2be00 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2be10 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2be20 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
2be30 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
2be40 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
2be50 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
2be60 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
2be70 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
2be80 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
2be90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2bea0 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
2beb0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
2bec0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
2bed0 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
2bee0 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
2bef0 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
2bf00 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
2bf10 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
2bf20 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
2bf30 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
2bf40 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
2bf50 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
2bf60 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
2bf70 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
2bf80 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
2bf90 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2bfa0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
2bfb0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
2bfc0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
2bfd0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
2bfe0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2bff0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2c000 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
2c010 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
2c020 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
2c030 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
2c040 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
2c050 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
2c060 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
2c070 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
2c080 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
2c090 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
2c0a0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2c0b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
2c0c0 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
2c0d0 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
2c0e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
2c0f0 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
2c100 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2c110 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
2c120 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
2c130 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
2c140 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2c150 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2c160 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2c170 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
2c180 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2c190 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2c1a0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2c1b0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
2c1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2c1d0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2c1e0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2c1f0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2c200 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2c210 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2c220 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2c230 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
2c240 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
2c250 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
2c260 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
2c270 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
2c280 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
2c290 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2c2a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2c2b0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
2c2c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2c2d0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
2c2e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2c2f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2c300 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2c310 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
2c320 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2c330 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2c340 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
2c350 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2c360 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2c370 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2c380 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2c390 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
2c3a0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2c3b0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
2c3c0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
2c3d0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
2c3e0 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
2c3f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2c400 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78  N_DB ){.    Unix
2c410 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
2c420 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  d;.    pUnused =
2c430 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28   findReusableFd(
2c440 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
2c450 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
2c460 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e  {.      fd = pUn
2c470 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65  used->fd;.    }e
2c480 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73  lse{.      pUnus
2c490 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
2c4a0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
2c4b0 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
2c4c0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
2c4d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c4e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c4f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
2c500 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
2c510 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
2c520 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
2c530 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2c540 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
2c550 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
2c560 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
2c570 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
2c580 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
2c590 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
2c5a0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
2c5b0 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2c5c0 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
2c5d0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2c5e0 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
2c5f0 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
2c600 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
2c610 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
2c620 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
2c630 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
2c640 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
2c650 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
2c660 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
2c670 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44  Delete && !syncD
2c680 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ir);.    rc = un
2c690 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  ixGetTempname(MA
2c6a0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54  X_PATHNAME+2, zT
2c6b0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
2c6c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c6d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2c6e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
2c6f0 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
2c700 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
2c710 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
2c720 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
2c730 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2c740 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
2c750 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
2c760 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
2c770 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2c780 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2c790 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
2c7a0 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
2c7b0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2c7c0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2c7d0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
2c7e0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
2c7f0 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
2c800 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
2c810 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
2c820 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
2c830 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
2c840 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
2c850 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
2c860 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
2c870 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
2c880 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
2c890 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
2c8a0 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
2c8b0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
2c8c0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
2c8d0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
2c8e0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
2c8f0 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
2c900 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
2c910 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2c920 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
2c930 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
2c940 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
2c950 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
2c960 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
2c970 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
2c980 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
2c990 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
2c9a0 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
2c9b0 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
2c9c0 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
2c9d0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75  le with */.    u
2c9e0 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca00 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
2ca10 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74  ile */.    gid_t
2ca20 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
2ca30 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
2ca40 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
2ca50 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
2ca60 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2ca70 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
2ca80 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26  penMode, &uid, &
2ca90 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
2caa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2cab0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
2cac0 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  >pUnused );.    
2cad0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2cae0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2caf0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2cb00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2cb10 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
2cb20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2cb30 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2cb40 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
2cb50 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
2cb60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
2cb70 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
2cb80 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
2cb90 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
2cba0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2cbb0 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
2cbc0 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
2cbd0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
2cbe0 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f      /* Failed to
2cbf0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66   open the file f
2cc00 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2cc10 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f  cess. Try read-o
2cc20 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c  nly. */.      fl
2cc30 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
2cc40 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2cc50 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2cc60 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  E);.      openFl
2cc70 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
2cc80 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
2cc90 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2cca0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2ccb0 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c       openFlags |
2ccc0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2ccd0 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
2cce0 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62  ;.      fd = rob
2ccf0 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
2cd00 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
2cd10 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
2cd20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2cd30 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2cd40 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2cd50 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
2cd60 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2cd70 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2cd80 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
2cd90 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
2cda0 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
2cdb0 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61  root and if crea
2cdc0 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62  ting a new rollb
2cdd0 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ack.    ** journ
2cde0 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20  al or WAL file, 
2cdf0 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69  set the ownershi
2ce00 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p of the journal
2ce10 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20   or WAL to be.  
2ce20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73    ** the same as
2ce30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2ce40 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
2ce50 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28     if( flags & (
2ce60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2ce70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ce80 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2ce90 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20     osFchown(fd, 
2cea0 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d  uid, gid);.    }
2ceb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
2cec0 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  d>=0 );.  if( pO
2ced0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a  utFlags ){.    *
2cee0 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  pOutFlags = flag
2cef0 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  s;.  }..  if( p-
2cf00 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  >pUnused ){.    
2cf10 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  p->pUnused->fd =
2cf20 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75   fd;.    p->pUnu
2cf30 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
2cf40 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
2cf50 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
2cf60 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
2cf70 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
2cf80 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  se.    osUnlink(
2cf90 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  zName);.#endif. 
2cfa0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e   }.#if SQLITE_EN
2cfb0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2cfc0 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70  LE.  else{.    p
2cfd0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70  ->openFlags = op
2cfe0 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e  enFlags;.  }.#en
2cff0 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
2d000 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2d010 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
2d020 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2d030 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
2d040 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d050 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61  STYLE.  if( fsta
2d060 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
2d070 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28   == -1 ){.    ((
2d080 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
2d090 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2d0a0 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f  rno;.    robust_
2d0b0 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
2d0c0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75  INE__);.    retu
2d0d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2d0e0 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66  ACCESS;.  }.  if
2d0f0 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22   (0 == strncmp("
2d100 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66  msdos", fsInfo.f
2d110 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29  _fstypename, 5))
2d120 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c   {.    ((unixFil
2d130 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61  e*)pFile)->fsFla
2d140 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46  gs |= SQLITE_FSF
2d150 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20  LAGS_IS_MSDOS;. 
2d160 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2d170 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69 61  Set up appropria
2d180 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a  te ctrlFlags */.
2d190 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1b0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2d1c0 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
2d1d0 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2d1f0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2d200 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  ILE_RDONLY;.  if
2d210 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20  ( noLock )      
2d220 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2d230 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2d240 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20  E_NOLOCK;.  if( 
2d250 73 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20  syncDir )       
2d260 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
2d270 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2d280 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66  DIRSYNC;.  if( f
2d290 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2d2a0 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61  EN_URI ) ctrlFla
2d2b0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55  gs |= UNIXFILE_U
2d2c0 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  RI;..#if SQLITE_
2d2d0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2d2e0 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
2d2f0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2d300 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
2d310 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
2d320 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
2d330 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
2d340 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
2d350 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
2d360 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
2d370 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
2d380 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
2d390 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
2d3a0 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
2d3b0 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
2d3c0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2d3d0 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
2d3e0 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
2d3f0 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
2d400 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
2d410 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
2d420 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
2d430 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
2d440 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
2d450 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
2d460 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
2d470 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
2d480 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
2d490 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  {.      if( stat
2d4a0 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66  fs(zPath, &fsInf
2d4b0 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  o) == -1 ){.    
2d4c0 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79      /* In theory
2d4d0 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20  , the close(fd) 
2d4e0 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69  call is sub-opti
2d4f0 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65  mal. If the file
2d500 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20   opened.        
2d510 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61 20  ** with fd is a 
2d520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2d530 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  nd there are oth
2d540 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  er connections o
2d550 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
2d560 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
2d570 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68   are currently h
2d580 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20  olding advisory 
2d590 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20  locks on it,.   
2d5a0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
2d5b0 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29   call to close()
2d5c0 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f   will cancel tho
2d5d0 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61  se locks. In pra
2d5e0 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a  ctice,.        *
2d5f0 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
2d600 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20 64   that statfs() d
2d610 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79  oesn't fail very
2d620 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74   often. At least
2d630 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2d640 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65  while other file
2d650 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2d660 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
2d670 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20  process on.     
2d680 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66     ** the same f
2d690 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e  ile are working.
2d6a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e    */.        p->
2d6b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2d6c0 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  o;.        robus
2d6d0 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2d6e0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2d6f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2d700 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20  ERR_ACCESS;.    
2d710 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
2d720 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a  nished;.      }.
2d730 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2d740 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67   !(fsInfo.f_flag
2d750 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20  s&MNT_LOCAL);.  
2d760 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50    }.    if( useP
2d770 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63  roxy ){.      rc
2d780 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
2d790 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
2d7a0 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
2d7b0 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
2d7c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d7d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72  .        rc = pr
2d7e0 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
2d7f0 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29  File((unixFile*)
2d800 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29  pFile, ":auto:")
2d810 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2d820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d830 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2d840 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65  unixClose to cle
2d850 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72  an up the resour
2d860 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c  ces added in fil
2d870 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20  lInUnixFile .   
2d880 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c         ** and cl
2d890 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75  ear all the stru
2d8a0 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63  cture's referenc
2d8b0 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c  es.  Specificall
2d8c0 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y, .          **
2d8d0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
2d8e0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f   will be NULL so
2d8f0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20   sqlite3OsClose 
2d900 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20  will be a no-op 
2d910 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2d920 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73          unixClos
2d930 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
2d940 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d960 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
2d970 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d  _finished;.    }
2d980 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
2d990 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
2d9a0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70  File(pVfs, fd, p
2d9b0 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72  File, zPath, ctr
2d9c0 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66  lFlags);..open_f
2d9d0 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
2d9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d9f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2da00 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  (p->pUnused);.  
2da10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2da20 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
2da30 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74  the file at zPat
2da40 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e  h. If the dirSyn
2da50 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  c argument is tr
2da60 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74  ue, fsync().** t
2da70 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  he directory aft
2da80 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
2da90 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2daa0 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a  int unixDelete(.
2dab0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e    sqlite3_vfs *N
2dac0 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56  otUsed,     /* V
2dad0 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
2dae0 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74  is as the xDelet
2daf0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  e method */.  co
2db00 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2db10 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2db20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  of file to be de
2db30 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  leted */.  int d
2db40 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  irSync          
2db50 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2db60 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f   fsync() directo
2db70 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e  ry after deletin
2db80 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  g file */.){.  i
2db90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2dba0 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  K;.  UNUSED_PARA
2dbb0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2dbc0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2dbd0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
2dbe0 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
2dbf0 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50   if( osUnlink(zP
2dc00 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ath)==(-1) ){.  
2dc10 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f    if( errno==ENO
2dc20 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ENT ){.      rc 
2dc30 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
2dc40 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20  ELETE_NOENT;.   
2dc50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2dc60 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2dc70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2dc80 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a  ETE, "unlink", z
2dc90 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
2dca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2dcb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2dcc0 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
2dcd0 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20   if( (dirSync & 
2dce0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  1)!=0 ){.    int
2dcf0 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73   fd;.    rc = os
2dd00 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  OpenDirectory(zP
2dd10 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69  ath, &fd);.    i
2dd20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dd30 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   ){.#if OS_VXWOR
2dd40 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  KS.      if( fsy
2dd50 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c  nc(fd)==-1 ).#el
2dd60 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79  se.      if( fsy
2dd70 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a  nc(fd) ).#endif.
2dd80 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2dd90 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2dda0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2ddb0 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63  IR_FSYNC, "fsync
2ddc0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ", zPath);.     
2ddd0 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f   }.      robust_
2dde0 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
2ddf0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
2de00 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2de10 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2de20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2de30 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  K;.    }.  }.#en
2de40 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2de50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  .}../*.** Test t
2de60 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
2de70 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
2de80 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50  sions of file zP
2de90 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74  ath. The.** test
2dea0 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e   performed depen
2deb0 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
2dec0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2ded0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
2dee0 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e  S_EXISTS: Return
2def0 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65   1 if the file e
2df00 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c  xists.**     SQL
2df10 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
2df20 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69  RITE: Return 1 i
2df30 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  f the file is re
2df40 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e  ad and writable.
2df50 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
2df60 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20  CCESS_READONLY: 
2df70 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
2df80 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65  file is readable
2df90 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2dfa0 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  e return 0..*/.s
2dfb0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63  tatic int unixAc
2dfc0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2dfd0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  vfs *NotUsed,   
2dfe0 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61  /* The VFS conta
2dff0 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65  ining this xAcce
2e000 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  ss method */.  c
2e010 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2e020 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f  ,      /* Path o
2e030 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78  f the file to ex
2e040 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66  amine */.  int f
2e050 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2e060 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65     /* What do we
2e070 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61   want to learn a
2e080 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66  bout the zPath f
2e090 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ile? */.  int *p
2e0a0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
2e0b0 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
2e0c0 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a  t boolean here *
2e0d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65  /.){.  int amode
2e0e0 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
2e0f0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
2e100 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
2e110 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2e120 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2e130 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ; );.  switch( f
2e140 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
2e150 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2e160 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f  XISTS:.      amo
2e170 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20  de = F_OK;.     
2e180 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2e190 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2e1a0 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
2e1b0 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f  amode = W_OK|R_O
2e1c0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
2e1d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2e1e0 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
2e1f0 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b     amode = R_OK;
2e200 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2e210 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2e220 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2e230 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2e240 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2e250 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28  Out = (osAccess(
2e260 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
2e270 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  );.  if( flags==
2e280 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2e290 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74  ISTS && *pResOut
2e2a0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
2e2b0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
2e2c0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2e2d0 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73  , &buf) && buf.s
2e2e0 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  t_size==0 ){.   
2e2f0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b     *pResOut = 0;
2e300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e320 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  .../*.** Turn a 
2e330 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2e340 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2e350 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61  thname. The rela
2e360 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20  tive path.** is 
2e370 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d  stored as a nul-
2e380 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
2e390 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  g in the buffer 
2e3a0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
2e3b0 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a   zPath. .**.** z
2e3c0 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Out points to a 
2e3d0 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
2e3e0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  st sqlite3_vfs.m
2e3f0 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20  xPathname bytes 
2e400 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73  .** (in this cas
2e410 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20  e, MAX_PATHNAME 
2e420 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c  bytes). The full
2e430 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  -path is written
2e440 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66   to.** this buff
2e450 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  er before return
2e460 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
2e470 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e  nt unixFullPathn
2e480 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
2e490 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2e4a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2e4b0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
2e4c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2e4d0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2e4e0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
2e4f0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
2e500 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20   */.  int nOut, 
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e520 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
2e530 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
2e540 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
2e550 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
2e560 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2e570 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
2e580 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2e590 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2e5a0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2e5b0 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2e5c0 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2e5d0 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2e5e0 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2e5f0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2e600 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2e610 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2e620 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
2e630 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c  n could fail if,
2e640 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   for example, th
2e650 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77  e.  ** current w
2e660 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
2e670 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
2e680 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ed..  */.  Simul
2e690 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2e6a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2e6b0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  );..  assert( pV
2e6c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
2e6d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
2e6e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e6f0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75  ER(pVfs);..  zOu
2e700 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27  t[nOut-1] = '\0'
2e710 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
2e720 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
2e730 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
2e740 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20  ut, zOut, "%s", 
2e750 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
2e760 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20  .    int nCwd;. 
2e770 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64 28     if( osGetcwd(
2e780 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30  zOut, nOut-1)==0
2e790 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e7a0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2e7b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2e7c0 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50  PT, "getcwd", zP
2e7d0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
2e7e0 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c  nCwd = (int)strl
2e7f0 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  en(zOut);.    sq
2e800 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
2e810 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b  Out-nCwd, &zOut[
2e820 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50  nCwd], "/%s", zP
2e830 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
2e840 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e850 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e860 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2e870 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2e880 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2e890 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2e8a0 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2e8b0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2e8c0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2e8d0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2e8e0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2e8f0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  brary..*/.#inclu
2e900 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61  de <dlfcn.h>.sta
2e910 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c  tic void *unixDl
2e920 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
2e930 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *NotUsed, const
2e940 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2e950 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e960 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
2e970 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28    return dlopen(
2e980 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f  zFilename, RTLD_
2e990 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41  NOW | RTLD_GLOBA
2e9a0 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  L);.}../*.** SQL
2e9b0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2e9c0 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74  unction immediat
2e9d0 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ely after a call
2e9e0 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20   to unixDlSym() 
2e9f0 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e  or.** unixDlOpen
2ea00 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e  () fails (return
2ea10 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
2ea20 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74  ). If a more det
2ea30 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  ailed error.** m
2ea40 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61  essage is availa
2ea50 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74  ble, it is writt
2ea60 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49  en to zBufOut. I
2ea70 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61  f no error messa
2ea80 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ge.** is availab
2ea90 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c  le, zBufOut is l
2eaa0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61  eft unmodified a
2eab0 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61  nd SQLite uses a
2eac0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f   default.** erro
2ead0 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74  r message..*/.st
2eae0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2eaf0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2eb00 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
2eb10 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2eb20 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Out){.  const ch
2eb30 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53  ar *zErr;.  UNUS
2eb40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2eb50 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74  Used);.  unixEnt
2eb60 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72  erMutex();.  zEr
2eb70 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20  r = dlerror();. 
2eb80 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2eb90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2eba0 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
2ebb0 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20   "%s", zErr);.  
2ebc0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
2ebd0 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ex();.}.static v
2ebe0 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28  oid (*unixDlSym(
2ebf0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2ec00 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63  Used, void *p, c
2ec10 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29  onst char*zSym))
2ec20 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20  (void){.  /* .  
2ec30 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64  ** GCC with -ped
2ec40 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79  antic-errors say
2ec50 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20  s that C90 does 
2ec60 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64  not allow a void
2ec70 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73  * to be.  ** cas
2ec80 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  t into a pointer
2ec90 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20   to a function. 
2eca0 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62   And yet the lib
2ecb0 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75  rary dlsym() rou
2ecc0 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e  tine.  ** return
2ecd0 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20  s a void* which 
2ece0 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
2ecf0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
2ed00 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65  n.  So how do we
2ed10 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28  .  ** use dlsym(
2ed20 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  ) with -pedantic
2ed30 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20  -errors?.  **.  
2ed40 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65  ** Variable x be
2ed50 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74  low is defined t
2ed60 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  o be a pointer t
2ed70 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  o a function tak
2ed80 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74  ing.  ** paramet
2ed90 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f  ers void* and co
2eda0 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65  nst char* and re
2edb0 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65  turning a pointe
2edc0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2edd0 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c  .  ** We initial
2ede0 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69  ize x by assigni
2edf0 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20  ng it a pointer 
2ee00 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66  to the dlsym() f
2ee10 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54  unction..  ** (T
2ee20 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72  hat assignment r
2ee30 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29  equires a cast.)
2ee40 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74    Then we call t
2ee50 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  he function that
2ee60 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74  .  ** x points t
2ee70 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  o.  .  **.  ** T
2ee80 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  his work-around 
2ee90 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77  is unlikely to w
2eea0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
2eeb0 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72   any system wher
2eec0 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c  e.  ** you reall
2eed0 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20  y cannot cast a 
2eee0 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
2eef0 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75   into void*.  Bu
2ef00 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20  t then, on the. 
2ef10 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20   ** other hand, 
2ef20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74  dlsym() will not
2ef30 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20   work on such a 
2ef40 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73  system either, s
2ef50 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e  o we have.  ** n
2ef60 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61  ot really lost a
2ef70 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  nything..  */.  
2ef80 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64  void (*(*x)(void
2ef90 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
2efa0 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  void);.  UNUSED_
2efb0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
2efc0 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28  d);.  x = (void(
2efd0 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  *(*)(void*,const
2efe0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64   char*))(void))d
2eff0 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28  lsym;.  return (
2f000 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  *x)(p, zSym);.}.
2f010 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2f020 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2f030 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
2f040 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
2f050 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2f060 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63  (NotUsed);.  dlc
2f070 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
2f080 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
2f090 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2f0a0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
2f0b0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
2f0c0 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20   unixDlOpen  0. 
2f0d0 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45   #define unixDlE
2f0e0 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
2f0f0 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20   unixDlSym   0. 
2f100 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43   #define unixDlC
2f110 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2f120 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20  *.** Write nBuf 
2f130 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20  bytes of random 
2f140 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70  data to the supp
2f150 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66  lied buffer zBuf
2f160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f170 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73  unixRandomness(s
2f180 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
2f190 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
2f1a0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2f1b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2f1c0 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
2f1d0 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d  t((size_t)nBuf>=
2f1e0 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b  (sizeof(time_t)+
2f1f0 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a  sizeof(int)));..
2f200 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20    /* We have to 
2f210 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20  initialize zBuf 
2f220 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72  to prevent valgr
2f230 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69  ind from reporti
2f240 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20  ng.  ** errors. 
2f250 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73   The reports iss
2f260 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20  ued by valgrind 
2f270 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20  are incorrect - 
2f280 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72  we would.  ** pr
2f290 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61  efer that the ra
2f2a0 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72  ndomness be incr
2f2b0 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20  eased by making 
2f2c0 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  use of the.  ** 
2f2d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  uninitialized sp
2f2e0 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75  ace in zBuf - bu
2f2f0 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  t valgrind error
2f300 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a  s tend to worry.
2f310 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e    ** some users.
2f320 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72    Rather than ar
2f330 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61  gue, it seems ea
2f340 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69  sier just to ini
2f350 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65  tialize.  ** the
2f360 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64   whole array and
2f370 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e   silence valgrin
2f380 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  d, even if that 
2f390 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f  means less rando
2f3a0 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68  mness.  ** in th
2f3b0 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20  e random seed.. 
2f3c0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65   **.  ** When te
2f3d0 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a  sting, initializ
2f3e0 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65  ing zBuf[] to ze
2f3f0 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e  ro is all we do.
2f400 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a    That means.  *
2f410 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73  * that we always
2f420 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61   use the same ra
2f430 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75  ndom number sequ
2f440 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  ence.  This make
2f450 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73  s the.  ** tests
2f460 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a   repeatable..  *
2f470 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  /.  memset(zBuf,
2f480 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21   0, nBuf);.#if !
2f490 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2f4a0 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
2f4b0 20 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a 20   pid, fd, got;. 
2f4c0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2f4d0 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
2f4e0 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  m", O_RDONLY, 0)
2f4f0 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  ;.    if( fd<0 )
2f500 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74  {.      time_t t
2f510 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29  ;.      time(&t)
2f520 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
2f530 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28  Buf, &t, sizeof(
2f540 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  t));.      pid =
2f550 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
2f560 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
2f570 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20  zeof(t)], &pid, 
2f580 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
2f590 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
2f5a0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64  of(t)+sizeof(pid
2f5b0 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
2f5c0 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
2f5d0 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
2f5e0 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c  of(pid);.    }el
2f5f0 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f  se{.      do{ go
2f600 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a  t = osRead(fd, z
2f610 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69  Buf, nBuf); }whi
2f620 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
2f630 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
2f640 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2f650 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
2f660 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2f670 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
2f680 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
2f690 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2f6a0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2f6b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2f6c0 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
2f6d0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
2f6e0 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
2f6f0 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
2f700 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
2f710 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2f720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
2f730 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
2f740 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
2f750 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
2f760 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
2f770 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
2f780 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
2f790 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
2f7a0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
2f7b0 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
2f7c0 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
2f7d0 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
2f7e0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
2f7f0 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
2f800 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
2f810 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
2f820 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
2f830 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
2f840 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
2f850 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
2f860 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
2f870 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
2f880 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
2f890 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
2f8a0 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
2f8b0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
2f8c0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
2f8d0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
2f8e0 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
2f8f0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
2f900 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
2f910 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
2f920 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
2f930 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f940 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
2f950 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
2f960 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
2f970 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
2f980 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
2f990 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
2f9a0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
2f9b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2f9c0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
2f9d0 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
2f9e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2f9f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2fa00 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2fa10 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2fa20 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2fa30 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2fa40 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2fa50 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2fa60 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2fa70 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2fa80 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2fa90 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2faa0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2fab0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2fac0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2fad0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2fae0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2faf0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2fb00 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2fb10 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2fb20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2fb30 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2fb40 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2fb50 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2fb60 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2fb70 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2fb80 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2fb90 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2fba0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2fbb0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2fbc0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2fbd0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2fbe0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2fbf0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2fc00 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2fc10 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2fc20 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2fc30 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2fc40 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2fc50 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2fc60 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2fc70 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2fc80 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2fc90 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2fca0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
2fcb0 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
2fcc0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2fcd0 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
2fce0 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
2fcf0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71  vfs *NotUsed, sq
2fd00 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
2fd10 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ow){.  static co
2fd20 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2fd30 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
2fd40 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
2fd50 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20  int64)8640000;. 
2fd60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2fd70 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  _OK;.#if defined
2fd80 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
2fd90 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
2fda0 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
2fdb0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
2fdc0 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
2fdd0 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
2fde0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
2fdf0 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
2fe00 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
2fe10 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
2fe20 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
2fe30 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
2fe40 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2fe50 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
2fe60 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
2fe70 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
2fe80 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
2fe90 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66  .  if( gettimeof
2fea0 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30  day(&sNow, 0)==0
2feb0 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
2fec0 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
2fed0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2fee0 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
2fef0 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30  Now.tv_usec/1000
2ff00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2ff10 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2ff20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
2ff30 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2ff40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
2ff50 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
2ff60 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
2ff70 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2ff80 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2ff90 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
2ffa0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
2ffb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ffc0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
2ffd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ffe0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2fff0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
30000 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
30010 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
30020 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
30030 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
30040 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
30050 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
30060 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
30070 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
30080 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
30090 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
300a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
300b0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
300c0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
300d0 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
300e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
300f0 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 i = 0;.  int 
30100 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rc;.  UNUSED_PAR
30110 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
30120 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72  .  rc = unixCurr
30130 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
30140 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
30150 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
30160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30170 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68 65  .** We added the
30180 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   xGetLastError()
30190 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68 65   method with the
301a0 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72   intention of pr
301b0 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65  oviding.** bette
301c0 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  r low-level erro
301d0 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20  r messages when 
301e0 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
301f0 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
30200 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
30210 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  te operation.  B
30220 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20  ut so far, none 
30230 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  of that has been
30240 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
30250 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f  in the core.  So
30260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30270 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
30280 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d  For now, it is m
30290 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65  erely.** a place
302a0 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  -holder..*/.stat
302b0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61  ic int unixGetLa
302c0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
302d0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
302e0 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72  t NotUsed2, char
302f0 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55   *NotUsed3){.  U
30300 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30310 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53  NotUsed);.  UNUS
30320 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30330 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44  Used2);.  UNUSED
30340 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
30350 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ed3);.  return 0
30360 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*.*******
30370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30380 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33  * End of sqlite3
30390 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
303a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
303b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
303c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
303d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
303e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
303f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30400 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
30410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30450 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
30460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30470 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79  **** Begin Proxy
30480 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
30490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
304b0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
304c0 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67   a "uber-locking
304d0 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73  -method" in this
304e0 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73   sense:  It uses
304f0 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f   the.** other lo
30500 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
30510 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20   secondary lock 
30520 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f  files.  Proxy lo
30530 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65  cking is a.** me
30540 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f  ta-layer over to
30550 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69  p of the primiti
30560 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  ve locking imple
30570 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46  mented above.  F
30580 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f  or.** this reaso
30590 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
305a0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
305b0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
305c0 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20   is deferred.** 
305d0 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68  until late in th
305e0 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66  e file (here) af
305f0 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f  ter all of the o
30600 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73  ther I/O methods
30610 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65   have.** been de
30620 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20  fined - so that 
30630 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f  the primitive lo
30640 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72  cking methods ar
30650 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61  e available.** a
30660 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65  s services to he
30670 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c  lp with the impl
30680 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72  ementation of pr
30690 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  oxy locking..**.
306a0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
306b0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73  efault locking s
306c0 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65  chemes in SQLite
306d0 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20   use byte-range 
306e0 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  locks on the.** 
306f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
30700 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65   coordinate safe
30710 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63  , concurrent acc
30720 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  ess by multiple 
30730 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77  readers.** and w
30740 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73  riters [http://s
30750 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e  qlite.org/lockin
30760 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20  gv3.html].  The 
30770 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  five file lockin
30780 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c  g.** states (UNL
30790 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20  OCKED, PENDING, 
307a0 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
307b0 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65  , EXCLUSIVE) are
307c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
307d0 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20  as POSIX read & 
307e0 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72  write locks over
307f0 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f   fixed set of lo
30800 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63  cations (via fsc
30810 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61  tl),.** on AFP a
30820 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c  nd SMB only excl
30830 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65  usive byte-range
30840 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c   locks are avail
30850 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a  able via fsctl.*
30860 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27  * with _IOWR('z'
30870 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
30880 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74  eRangeLockPB2) t
30890 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65  o track the same
308a0 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f   5 states..** To
308b0 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44   simulate a F_RD
308c0 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65  LCK on the share
308d0 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20  d range, on AFP 
308e0 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  a randomly selec
308f0 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69  ted.** address i
30900 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e  n the shared ran
30910 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
30920 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
30930 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61  he entire.** sha
30940 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
30950 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53  en for an EXCLUS
30960 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a  IVE lock):.**.**
30970 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
30980 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  TE        0x4000
30990 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53  0000.**      RES
309a0 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
309b0 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
309c0 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
309d0 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
309e0 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
309f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
30a00 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
30a10 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
30a20 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
30a30 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
30a40 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
30a50 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
30a60 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
30a70 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
30a80 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
30a90 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
30aa0 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
30ab0 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
30ac0 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
30ad0 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
30ae0 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
30af0 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
30b00 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
30b10 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
30b20 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
30b30 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
30b40 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
30b50 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
30b60 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
30b70 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
30b80 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
30b90 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
30ba0 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
30bb0 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
30bc0 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
30bd0 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
30be0 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
30bf0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
30c00 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
30c10 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
30c20 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
30c30 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
30c40 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
30c50 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
30c60 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
30c70 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
30c80 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
30c90 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
30ca0 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
30cb0 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
30cc0 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
30cd0 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
30ce0 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
30cf0 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
30d00 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
30d10 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
30d20 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
30d30 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
30d40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
30d50 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
30d60 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
30d70 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
30d80 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
30d90 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
30da0 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
30db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
30dc0 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
30dd0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
30de0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
30df0 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
30e00 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
30e30 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
30e40 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
30e50 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
30e60 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
30e70 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f  PROXYFILE, &<pro
30e80 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a  xy_path>);.**.**
30e90 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a  .** SQL pragmas.
30ea0 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  **.**  PRAGMA [d
30eb0 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
30ec0 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f  oxy_file=<proxy_
30ed0 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a  path> | :auto:.*
30ee0 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
30ef0 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
30f00 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  file.**.** Speci
30f10 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d  fying ":auto:" m
30f20 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
30f30 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69  re is a conch fi
30f40 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  le with a matchi
30f50 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e  ng.** host ID in
30f60 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70   it, the proxy p
30f70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
30f80 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
30f90 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a  ed, otherwise.**
30fa0 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61   a proxy path ba
30fb0 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27  sed on the user'
30fc0 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76  s temp dir.** (v
30fd0 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ia confstr(_CS_D
30fe0 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
30ff0 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62  DIR,...)) will b
31000 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
31010 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66  * actual proxy f
31020 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65  ile name is gene
31030 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e  rated from the n
31040 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20  ame and path of 
31050 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
31060 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  file.  For examp
31070 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
31080 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74  For database pat
31090 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f  h "/Users/me/foo
310a0 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54  .db" .**       T
310b0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  he lock path wil
310c0 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73  l be "<tmpdir>/s
310d0 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65  qliteplocks/_Use
310e0 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74  rs_me_foo.db:aut
310f0 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  o:").**.** Once 
31100 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20  a lock proxy is 
31110 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61  configured for a
31120 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
31130 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74  tion, it can not
31140 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
31150 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62  however it may b
31160 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20  e switched to a 
31170 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20  different proxy 
31180 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20  path via.** the 
31190 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75  above APIs (assu
311a0 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66  ming the conch f
311b0 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ile is not being
311c0 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
311d0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  .** connection o
311e0 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a  r process). .**.
311f0 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20  **.** How proxy 
31200 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a  locking works.**
31210 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
31220 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50  --------.**.** P
31230 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
31240 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69  g relies primari
31250 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75  ly on two new su
31260 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20  pporting files: 
31270 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63  .**.**   *  conc
31280 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20  h file to limit 
31290 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
312a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61  tabase file to a
312b0 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20   single host.** 
312c0 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a       at a time.*
312d0 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20  *.**   *  proxy 
312e0 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61  file to act as a
312f0 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61   proxy for the a
31300 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f  dvisory locks no
31310 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74  rmally.**      t
31320 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
31330 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  base.**.** The c
31340 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75  onch file - to u
31350 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c  se a proxy file,
31360 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72   sqlite must fir
31370 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e  st "hold the con
31380 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67  ch".** by taking
31390 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65   an sqlite-style
313a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
313b0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  the conch file, 
313c0 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63  reading the.** c
313d0 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70  ontents and comp
313e0 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73  aring the host's
313f0 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20   unique host ID 
31400 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20  (see below) and 
31410 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61  lock.** proxy pa
31420 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76  th against the v
31430 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
31440 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20  the conch.  The 
31450 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a  conch file is.**
31460 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
31470 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
31480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31490 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
314a0 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65  name.** is patte
314b0 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64  rned after the d
314c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
314d0 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65  e as ".<database
314e0 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a  name>-conch"..**
314f0 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   If the conch fi
31500 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
31510 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65  t, or it's conte
31520 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
31530 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
31540 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
31550 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
31560 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
31570 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
31580 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
31590 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
315a0 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
315b0 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
315c0 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
315d0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
315e0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
315f0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
31600 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
31610 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
31620 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
31630 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
31640 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
31650 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
31660 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
31670 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
31680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
31690 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
316a0 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
316b0 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
316c0 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
316d0 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
316e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
316f0 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
31700 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
31710 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
31720 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
31730 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
31740 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
31750 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
31760 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
31770 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
31780 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
31790 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
317a0 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
317b0 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
317c0 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
317d0 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
317e0 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
317f0 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
31800 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
31810 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
31820 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
31830 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
31840 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
31850 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
31860 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
31870 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
31880 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
31890 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
318a0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
318b0 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
318c0 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
318d0 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
318e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
318f0 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
31900 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
31910 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
31920 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
31930 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
31940 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
31950 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
31960 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
31970 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
31980 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
31990 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
319a0 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
319b0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
319c0 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
319d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
319e0 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
319f0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
31a00 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
31a10 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
31a20 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
31a30 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
31a40 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
31a50 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
31a60 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
31a70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
31a80 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
31a90 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
31aa0 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
31ab0 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
31ac0 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
31ad0 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
31ae0 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
31af0 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
31b00 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
31b10 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
31b20 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
31b30 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
31b40 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
31b50 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
31b60 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
31b70 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
31b80 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
31b90 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
31ba0 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
31bb0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
31bc0 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
31bd0 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
31be0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
31bf0 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
31c00 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
31c10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
31c20 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
31c30 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
31c40 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
31c50 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
31c60 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
31c70 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
31c80 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
31c90 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
31ca0 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
31cb0 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
31cc0 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
31cd0 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
31ce0 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
31cf0 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
31d00 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
31d10 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
31d20 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
31d30 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
31d40 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
31d50 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
31d60 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
31d70 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
31d80 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
31d90 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
31da0 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
31db0 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
31dc0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
31dd0 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
31de0 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
31df0 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63  les (explicity c
31e00 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54  alling the SQLIT
31e10 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
31e20 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
31e30 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
31e40 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
31e50 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
31e60 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
31e70 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
31e80 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
31e90 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
31ea0 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
31eb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
31ec0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
31ed0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
31ee0 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
31ef0 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
31f00 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
31f10 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
31f20 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
31f30 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
31f40 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
31f50 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
31f60 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
31f70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
31f80 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
31f90 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
31fa0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
31fb0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
31fc0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
31fd0 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
31fe0 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
31ff0 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
32000 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
32010 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
32020 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
32030 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
32040 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
32050 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
32060 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
32070 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
32080 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
32090 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
320a0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
320b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
320c0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
320d0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
320e0 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
320f0 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
32100 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
32110 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
32120 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b  .  void *oldLock
32130 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
32140 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  /* Original lock
32150 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ingcontext to re
32160 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  store on close *
32170 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  /.  sqlite3_io_m
32180 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f  ethods const *pO
32190 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a  ldMethod;     /*
321a0 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65   Original I/O me
321b0 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20  thods for close 
321c0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
321d0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
321e0 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64  e path for the d
321f0 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74  atabase at dbPat
32200 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  h is written int
32210 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69  o lPath, .** whi
32220 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ch must point to
32230 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65   valid, writable
32240 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e   memory large en
32250 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65  ough for a maxLe
32260 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65  n length.** file
32270 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69   path. .*/.stati
32280 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
32290 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
322a0 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
322b0 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
322c0 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
322d0 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
322e0 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
322f0 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
32300 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
32310 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
32320 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
32330 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
32340 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
32350 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21  IR.  {.    if( !
32360 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
32370 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
32380 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
32390 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
323a0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
323b0 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f   failed %s errno
323c0 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%d pid=%d\n",. 
323d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
323e0 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70  ath, errno, getp
323f0 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65  id()));.      re
32400 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
32410 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  R_LOCK;.    }.  
32420 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
32430 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
32440 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20  ocks", maxLen); 
32450 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20     .  }.# else. 
32460 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
32470 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d  Path, "/tmp/", m
32480 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a  axLen);.# endif.
32490 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50  #endif..  if( lP
324a0 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20  ath[len-1]!='/' 
324b0 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
324c0 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c  lcat(lPath, "/",
324d0 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20   maxLen);.  }.  
324e0 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20  .  /* transform 
324f0 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61  the db path to a
32500 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61   unique cache na
32510 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20  me */.  dbLen = 
32520 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
32530 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b  th);.  for( i=0;
32540 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c   i<dbLen && (i+l
32550 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65  en+7)<(int)maxLe
32560 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
32570 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
32580 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
32590 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
325a0 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
325b0 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
325c0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
325d0 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
325e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54  .  OSTRACE(("GET
325f0 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
32600 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
32610 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67  =%d\n", lPath, g
32620 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
32630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32640 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65  ../* . ** Create
32650 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  s the lock file 
32660 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20  and any missing 
32670 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c  directories in l
32680 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74  ockPath. */.stat
32690 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
326a0 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  teLockPath(const
326b0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29   char *lockPath)
326c0 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a  {.  int i, len;.
326d0 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41    char buf[MAXPA
326e0 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74  THLEN];.  int st
326f0 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  art = 0;.  .  as
32700 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e  sert(lockPath!=N
32710 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  ULL);.  /* try t
32720 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65  o create all the
32730 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69   intermediate di
32740 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c  rectories */.  l
32750 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
32760 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75  (lockPath);.  bu
32770 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[0] = lockPath[
32780 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20  0];.  for( i=1; 
32790 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20  i<len; i++ ){.  
327a0 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69    if( lockPath[i
327b0 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d  ] == '/' && (i -
327c0 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20   start > 0) ){. 
327d0 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64       /* only mkd
327e0 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21  ir if leaf dir !
327f0 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20  = "." or "/" or 
32800 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ".." */.      if
32810 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28  ( i-start>2 || (
32820 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75  i-start==1 && bu
32830 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
32840 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
32850 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20   '/') .         
32860 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26  || (i-start==2 &
32870 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
32880 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
32890 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20  +1] != '.') ){. 
328a0 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c         buf[i]='\
328b0 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
328c0 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c  osMkdir(buf, SQL
328d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
328e0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
328f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
32900 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20  nt err=errno;.  
32910 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 21          if( err!
32920 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20  =EEXIST ) {.    
32930 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
32940 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
32950 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e    FAILED creatin
32960 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20  g %s, ".        
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27 25               "'%
32980 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  s' proxy lock pa
32990 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
329a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
329b0 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65 72        buf, strer
329c0 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61  ror(err), lockPa
329d0 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  th, getpid()));.
329e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
329f0 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20  rn err;.        
32a00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32a10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
32a20 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t=i+1;.    }.   
32a30 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61   buf[i] = lockPa
32a40 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54  th[i];.  }.  OST
32a50 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
32a60 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
32a70 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
32a80 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67  \n", lockPath, g
32a90 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74  etpid()));.  ret
32aa0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
32ab0 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53  Create a new VFS
32ac0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
32ad0 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f   (stored in memo
32ae0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
32af0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
32b00 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65  oc) and open the
32b10 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74   file named "pat
32b20 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  h" in the file d
32b30 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
32b40 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
32b50 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f  esponsible not o
32b60 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  nly for closing 
32b70 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
32b80 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20  tor.** but also 
32b90 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
32ba0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
32bb0 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  d with the file 
32bc0 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73  descriptor..*/.s
32bd0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
32be0 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  reateUnixFile(. 
32bf0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
32c00 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70  ath,        /* p
32c10 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ath for the new 
32c20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20  unixFile */.    
32c30 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c  unixFile **ppFil
32c40 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78  e,       /* unix
32c50 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64  File created and
32c60 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66   returned by ref
32c70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f   */.    int islo
32c80 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20  ckfile          
32c90 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20   /* if non zero 
32ca0 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c  missing dirs wil
32cb0 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  l be created */.
32cc0 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ) {.  int fd = -
32cd0 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  1;.  unixFile *p
32ce0 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  New;.  int rc = 
32cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
32d00 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
32d10 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
32d20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d   sqlite3_vfs dum
32d30 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72  myVfs;.  int ter
32d40 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55  rno = 0;.  UnixU
32d50 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
32d60 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31   = NULL;..  /* 1
32d70 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f  . first try to o
32d80 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66  pen/create the f
32d90 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74  ile.  ** 2. if t
32da0 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74  hat fails, and t
32db0 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69  his is a lock fi
32dc0 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20  le (not-conch), 
32dd0 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  try creating.  *
32de0 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  * the parent dir
32df0 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65  ectories and the
32e00 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a  n try again..  *
32e10 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 3. if that fai
32e20 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ls, try to open 
32e30 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e  the file read-on
32e40 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73  ly.  ** otherwis
32e50 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69  e return BUSY (i
32e60 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20  f lock file) or 
32e70 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65  CANTOPEN for the
32e80 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f   conch file.  */
32e90 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e  .  pUnused = fin
32ea0 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68  dReusableFd(path
32eb0 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20  , openFlags);.  
32ec0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
32ed0 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d     fd = pUnused-
32ee0 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >fd;.  }else{.  
32ef0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
32f00 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
32f10 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
32f20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
32f30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
32f40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32f50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
32f60 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
32f70 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
32f80 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
32f90 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
32fa0 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
32fb0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
32fc0 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
32fd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
32fe0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
32ff0 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
33000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
33010 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
33020 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
33030 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
33040 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
33050 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
33060 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
33070 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
33080 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
33090 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
330a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
330b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
330c0 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
330d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
330e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
330f0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
33100 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
33110 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
33120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33130 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
33140 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
33150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33160 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
33170 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
33180 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
33190 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
331a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
331b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
331c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
331d0 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
331e0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
331f0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  oc(sizeof(*pNew)
33200 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
33210 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
33220 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
33230 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
33240 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
33250 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
33260 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
33270 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
33280 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
33290 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
332a0 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
332b0 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
332c0 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
332d0 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
332e0 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
332f0 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
33300 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
33310 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
33320 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
33330 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
33340 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
33350 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
33360 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
33370 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c  mmyVfs, fd, (sql
33380 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
33390 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28   path, 0);.  if(
333a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
333b0 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
333c0 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
333d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
333e0 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
333f0 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
33400 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
33410 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
33420 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
33430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33440 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
33450 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
33460 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
33470 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
33480 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
33490 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
334a0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
334b0 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
334c0 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
334d0 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
334e0 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
334f0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
33500 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
33510 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73  /../* Not always
33520 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
33530 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f 75  headers as it ou
33540 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74  ght to be */.ext
33550 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75  ern int gethostu
33560 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63  uid(uuid_t id, c
33570 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
33580 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a  spec *wait);../*
33590 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44   get the host ID
335a0 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64   via gethostuuid
335b0 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74  (), pHostID must
335c0 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f   point to PROXY_
335d0 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79  HOSTIDLEN .** by
335e0 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20  tes of writable 
335f0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
33600 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f  c int proxyGetHo
33610 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68  stID(unsigned ch
33620 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74  ar *pHostID, int
33630 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73   *pError){.  ass
33640 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44  ert(PROXY_HOSTID
33650 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75  LEN == sizeof(uu
33660 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74  id_t));.  memset
33670 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f  (pHostID, 0, PRO
33680 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23  XY_HOSTIDLEN);.#
33690 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58  if defined(__MAX
336a0 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
336b0 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20  N_REQUIRED)\.   
336c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 5f              && _
336d0 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
336e0 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31  N_MIN_REQUIRED<1
336f0 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74  050.  {.    stat
33700 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
33710 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74  timespec timeout
33720 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20   = {1, 0}; /* 1 
33730 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  sec timeout */. 
33740 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75 75     if( gethostuu
33750 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d  id(pHostID, &tim
33760 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69  eout) ){.      i
33770 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a  nt err = errno;.
33780 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f 72        if( pError
33790 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72   ){.        *pEr
337a0 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20  ror = err;.     
337b0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
337c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
337d0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
337e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
337f0 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66  (pError);.#endif
33800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
33810 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74  EST.  /* simulat
33820 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73  e multiple hosts
33830 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69   by creating uni
33840 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20  que hostid file 
33850 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73  paths */.  if( s
33860 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
33870 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f  m != 0){.    pHo
33880 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29  stID[0] = (char)
33890 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63  (pHostID[0] + (c
338a0 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73  har)(sqlite3_hos
338b0 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29  tid_num & 0xFF))
338c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
338d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
338e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  OK;.}../* The co
338f0 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nch file contain
33900 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f  s the header, ho
33910 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66  st id and lock f
33920 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65  ile path. */.#de
33930 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48  fine PROXY_CONCH
33940 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31  VERSION 2   /* 1
33950 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31 36  -byte header, 16
33960 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70  -byte host id, p
33970 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ath */.#define P
33980 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20  ROXY_HEADERLEN  
33990 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66    1   /* conch f
339a0 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74  ile header lengt
339b0 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
339c0 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20  XY_PATHINDEX    
339d0 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e  (PROXY_HEADERLEN
339e0 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e  +PROXY_HOSTIDLEN
339f0 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ).#define PROXY_
33a00 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52  MAXCONCHLEN  (PR
33a10 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
33a20 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41  OXY_HOSTIDLEN+MA
33a30 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a  XPATHLEN)../* .*
33a40 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20  * Takes an open 
33a50 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69  conch file, copi
33a60 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
33a70 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e  to a new path an
33a80 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a  d then moves .**
33a90 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e   it back.  The n
33aa0 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c  ewly created fil
33ab0 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  e's file descrip
33ac0 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64 20  tor is assigned 
33ad0 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20  to the.** conch 
33ae0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  file structure a
33af0 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f  nd finally the o
33b00 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69  riginal conch fi
33b10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
33b20 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65   .** closed.  Re
33b30 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75  turns zero if su
33b40 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61  ccessful..*/.sta
33b50 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65  tic int proxyBre
33b60 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78  akConchLock(unix
33b70 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69  File *pFile, uui
33b80 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20  d_t myHostID){. 
33b90 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
33ba0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
33bb0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
33bc0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
33bd0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
33be0 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
33bf0 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
33c00 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74  ile;.  char tPat
33c10 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
33c20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f   char buf[PROXY_
33c30 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
33c40 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43  char *cPath = pC
33c50 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74  tx->conchFilePat
33c60 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64  h;.  size_t read
33c70 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f  Len = 0;.  size_
33c80 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20  t pathLen = 0;. 
33c90 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d   char errmsg[64]
33ca0 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20   = "";.  int fd 
33cb0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
33cc0 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   -1;.  UNUSED_PA
33cd0 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44  RAMETER(myHostID
33ce0 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20  );..  /* create 
33cf0 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65  a new path by re
33d00 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69  place the traili
33d10 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68  ng '-conch' with
33d20 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70   '-break' */.  p
33d30 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79  athLen = strlcpy
33d40 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d  (tPath, cPath, M
33d50 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66  AXPATHLEN);.  if
33d60 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54  ( pathLen>MAXPAT
33d70 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c  HLEN || pathLen<
33d80 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c  6 || .     (strl
33d90 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c  cpy(&tPath[pathL
33da0 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20  en-5], "break", 
33db0 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20  6) != 5) ){.    
33dc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
33dd0 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
33de0 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72  errmsg,"path err
33df0 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e  or (len %d)",(in
33e00 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  t)pathLen);.    
33e10 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
33e20 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61  ck;.  }.  /* rea
33e30 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74  d the conch cont
33e40 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e  ent */.  readLen
33e50 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
33e60 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52  File->h, buf, PR
33e70 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c  OXY_MAXCONCHLEN,
33e80 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c   0);.  if( readL
33e90 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  en<PROXY_PATHIND
33ea0 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EX ){.    sqlite
33eb0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
33ec0 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
33ed0 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65  ,"read error (le
33ee0 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64  n %d)",(int)read
33ef0 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
33f00 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
33f10 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20  }.  /* write it 
33f20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f  out to the tempo
33f30 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20  rary break file 
33f40 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74  */.  fd = robust
33f50 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f  _open(tPath, (O_
33f60 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  RDWR|O_CREAT|O_E
33f70 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20  XCL), 0);.  if( 
33f80 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  fd<0 ){.    sqli
33f90 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
33fa0 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
33fb0 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69  msg, "create fai
33fc0 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
33fd0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
33fe0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
33ff0 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66 64   if( osPwrite(fd
34000 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20  , buf, readLen, 
34010 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72  0) != (ssize_t)r
34020 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71  eadLen ){.    sq
34030 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
34040 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
34050 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61  rrmsg, "write fa
34060 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
34070 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
34080 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
34090 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61    if( rename(tPa
340a0 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20  th, cPath) ){.  
340b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
340c0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
340d0 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61  ), errmsg, "rena
340e0 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  me failed (%d)",
340f0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
34100 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
34110 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
34120 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
34130 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f   "broke stale lo
34140 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61  ck on %s\n", cPa
34150 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c  th);.  robust_cl
34160 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68  ose(pFile, conch
34170 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
34180 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d  _);.  conchFile-
34190 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68  >h = fd;.  conch
341a0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
341b0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
341c0 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f  AT;..end_breaklo
341d0 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ck:.  if( rc ){.
341e0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
341f0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
34200 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f  tPath);.      ro
34210 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
34220 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
34230 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
34240 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
34250 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
34260 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
34270 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
34280 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
34290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
342a0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
342b0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
342c0 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
342d0 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
342e0 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
342f0 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
34300 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
34310 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
34320 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
34330 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
34340 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
34350 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
34360 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
34370 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
34380 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
34390 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
343a0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
343b0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
343c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
343d0 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
343e0 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
343f0 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
34400 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74  ime;.  .  memset
34410 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20  (&conchModTime, 
34420 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d  0, sizeof(conchM
34430 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b  odTime));.  do {
34440 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46  .    rc = conchF
34450 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
34460 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
34470 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
34480 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72  ckType);.    nTr
34490 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ies ++;.    if( 
344a0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
344b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
344c0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28  he lock failed (
344d0 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20  busy):.       * 
344e0 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68 65  1st try: get the
344f0 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65   mod time of the
34500 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35   conch, wait 0.5
34510 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
34520 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74   .       * 2nd t
34530 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20  ry: fail if the 
34540 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64  mod time changed
34550 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20 64   or host id is d
34560 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a  ifferent, wait .
34570 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20 20         *        
34580 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74 72     10 sec and tr
34590 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a  y again.       *
345a0 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20   3rd try: break 
345b0 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20  the lock unless 
345c0 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73  the mod time has
345d0 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20   changed..      
345e0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
345f0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20   stat buf;.     
34600 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e   if( osFstat(con
34610 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  chFile->h, &buf)
34620 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
34630 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
34640 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
34650 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
34660 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  R_LOCK;.      }.
34670 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
34680 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20   nTries==1 ){.  
34690 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
346a0 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  me = buf.st_mtim
346b0 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75  espec;.        u
346c0 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f  sleep(500000); /
346d0 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20 61  * wait 0.5 sec a
346e0 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20  nd try the lock 
346f0 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20  again*/.        
34700 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20  continue;  .    
34710 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
34720 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20  t( nTries>1 );. 
34730 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f       if( conchMo
34740 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20  dTime.tv_sec != 
34750 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
34760 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20  .tv_sec || .    
34770 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d       conchModTim
34780 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66  e.tv_nsec != buf
34790 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76  .st_mtimespec.tv
347a0 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20  _nsec ){.       
347b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
347c0 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  USY;.      }.   
347d0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54     .      if( nT
347e0 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20  ries==2 ){  .   
347f0 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b 50       char tBuf[P
34800 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
34810 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ];.        int l
34820 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
34830 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c  chFile->h, tBuf,
34840 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
34850 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  EN, 0);.        
34860 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  if( len<0 ){.   
34870 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
34880 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
34890 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
348a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
348b0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
348c0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
348d0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
348e0 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
348f0 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
34900 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
34910 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
34920 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
34930 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
34940 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
34950 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
34960 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
34970 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
34980 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
34990 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
349a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
349b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
349c0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
349d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
349e0 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
349f0 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
34a00 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
34a10 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
34a20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34a30 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
34a40 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
34a50 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
34a60 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
34a70 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
34a80 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
34a90 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
34aa0 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
34ab0 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
34ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
34ad0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
34ae0 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
34af0 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
34b00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
34b10 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
34b20 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
34b30 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
34b40 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
34b50 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
34b60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
34b70 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
34b80 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20  _LOCK);         
34b90 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
34ba0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
34bb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
34bc0 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
34bd0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
34be0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
34bf0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
34c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34c10 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
34c20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
34c30 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
34c40 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
34c50 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
34c60 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
34c70 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
34c80 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
34c90 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
34ca0 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
34cb0 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
34cc0 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
34cd0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
34ce0 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
34cf0 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
34d00 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
34d10 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
34d20 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
34d30 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
34d40 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
34d50 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
34d60 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
34d70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
34d80 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
34d90 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
34da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
34db0 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
34dc0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
34dd0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34de0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
34df0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
34e00 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
34e10 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
34e20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
34e30 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
34e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
34e60 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
34e70 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
34e80 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
34e90 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
34ea0 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
34eb0 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
34ec0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
34ed0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
34ee0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
34ef0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
34f00 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
34f10 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
34f20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
34f30 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
34f40 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
34f50 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
34f60 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
34f70 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
34f80 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
34f90 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
34fa0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
34fb0 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
34fc0 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
34fd0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
34fe0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
34ff0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
35000 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
35010 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
35020 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67  h : ":auto:"), g
35030 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20  etpid()));..    
35040 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
35050 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
35060 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
35070 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
35080 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
35090 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
350a0 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
350b0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
350c0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
350d0 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
350e0 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
350f0 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
35100 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35120 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
35130 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
35140 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
35150 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
35160 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
35170 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
35180 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
35190 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
351a0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
351b0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
351c0 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
351d0 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
351e0 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
351f0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
35200 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
35210 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
35220 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
35230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
35240 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
35250 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
35260 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
35270 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
35280 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
35290 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
352a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
352b0 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
352c0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
352d0 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
352e0 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
352f0 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
35300 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
35310 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
35320 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
35330 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
35340 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
35350 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
35360 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
35370 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
35380 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
35390 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
353a0 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
353b0 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
353c0 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
353d0 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
353e0 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
353f0 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
35400 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
35410 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
35420 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
35430 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
35440 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
35450 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
35460 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
35470 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
35480 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
35490 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
354a0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
354b0 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
354c0 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
354d0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
354e0 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
354f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35500 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
35510 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
35520 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
35530 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
35540 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
35550 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
35560 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
35570 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
35580 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
35590 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
355a0 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
355b0 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
355c0 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
355d0 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
355e0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
355f0 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
35600 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
35610 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35620 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
35630 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
35640 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
35650 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
35660 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
35670 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
35680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
35690 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
356a0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
356b0 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
356c0 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
356d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
356e0 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
356f0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
35700 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
35710 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
35720 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
35730 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
35740 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
35750 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
35760 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
35770 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
35780 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
35790 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
357a0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
357b0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
357c0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
357d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
357e0 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
357f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
35800 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
35810 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
35820 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
35830 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
35840 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
35850 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
35860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35870 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
35880 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
35890 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
358a0 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
358b0 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
358c0 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
358d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
358e0 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
358f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35900 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
35910 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
35920 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
35930 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
35940 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
35950 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
35960 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
35970 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
35980 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35990 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
359a0 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
359b0 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
359c0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
359d0 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
359e0 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
359f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
35a00 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
35a10 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
35a20 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
35a30 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
35a40 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
35a50 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
35a60 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
35a70 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
35a80 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
35a90 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
35aa0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
35ab0 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
35ac0 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
35ad0 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
35ae0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
35af0 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
35b00 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
35b10 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
35b20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
35b30 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
35b40 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
35b50 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
35b60 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
35b70 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
35b80 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
35b90 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
35ba0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
35bb0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
35bc0 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
35bd0 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
35be0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
35bf0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20  File->pInode && 
35c00 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64  conchFile->pInod
35c10 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
35c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
35c30 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
35c40 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
35c50 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
35c60 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
35c70 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70         ** same p
35c80 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
35c90 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
35ca0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   lock. */.      
35cb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35cc0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20  BUSY;.        } 
35cd0 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20 20  else {          
35ce0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35cf0 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70  proxyConchLock(p
35d00 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20  File, myHostID, 
35d10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
35d20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35d40 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
35d50 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
35d60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
35d70 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49  nchFile, EXCLUSI
35d80 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
35d90 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
35da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35db0 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65 42       char writeB
35dc0 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43  uffer[PROXY_MAXC
35dd0 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20  ONCHLEN];.      
35de0 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20    int writeSize 
35df0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  = 0;.        .  
35e00 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66 65        writeBuffe
35e10 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f  r[0] = (char)PRO
35e20 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b  XY_CONCHVERSION;
35e30 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
35e40 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
35e50 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
35e60 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
35e70 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20  OSTIDLEN);.     
35e80 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63     if( pCtx->loc
35e90 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c  kProxyPath!=NULL
35ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
35eb0 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
35ec0 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
35ed0 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  EX], pCtx->lockP
35ee0 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
35ef0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d  HLEN);.        }
35f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
35f10 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75  strlcpy(&writeBu
35f20 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49  ffer[PROXY_PATHI
35f30 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50  NDEX], tempLockP
35f40 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
35f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35f60 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20      writeSize = 
35f70 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
35f80 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42  + strlen(&writeB
35f90 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
35fa0 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20  INDEX]);.       
35fb0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
35fc0 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
35fd0 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
35fe0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
35ff0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
36000 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
36010 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
36020 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
36030 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
36040 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
36050 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
36060 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
36070 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
36080 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
36090 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
360a0 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
360b0 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
360c0 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
360d0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
360e0 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
360f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
36100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
36110 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
36120 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
36130 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
36140 69 6e 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61  int err = osFsta
36150 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
36160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
36170 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20   err==0 ){.     
36180 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d         mode_t cm
36190 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64  ode = buf.st_mod
361a0 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55  e&(S_IRUSR|S_IWU
361b0 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49  SR | S_IRGRP|S_I
361c0 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20  WGRP |.         
361d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
361f0 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b  _IROTH|S_IWOTH);
36200 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
36210 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  try to match the
36220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 52   database file R
36230 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  /W permissions, 
36240 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a  ignore failure *
36250 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
36260 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20  _PROXY_DEBUG.   
36270 20 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f           osFchmo
36280 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
36290 63 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  cmode);.#else.  
362a0 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
362b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
362c0 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46   osFchmod(conchF
362d0 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
362e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 77 68 69              }whi
362f0 6c 65 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20  le( rc==(-1) && 
36300 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
36310 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
36320 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
36330 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
36340 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
36350 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
36360 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25  tderr, "fchmod %
36370 6f 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64  o FAILED with %d
36380 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
36390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d                cm
363a0 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72  ode, code, strer
363b0 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20  ror(code));.    
363c0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
363d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
363e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
363f0 66 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44  fchmod %o SUCCED
36400 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20  ED\n",cmode);.  
36410 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36430 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64           int cod
36440 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  e = errno;.     
36450 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
36460 74 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49  tderr, "STAT FAI
36470 4c 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20  LED[%d] with %d 
36480 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  %s\n", .        
36490 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c              err,
364a0 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28   code, strerror(
364b0 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20  code));.#endif. 
364c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
364d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
364e0 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d     conchFile->pM
364f0 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28  ethod->xUnlock((
36500 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
36510 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
36520 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20  LOCK);.      .  
36530 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a    end_takeconch:
36540 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
36550 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f  "TRANSPROXY: CLO
36560 53 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  SE  %d\n", pFile
36570 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ->h));.      if(
36580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
36590 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  & pFile->openFla
365a0 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  gs ){.        in
365b0 74 20 66 64 3b 0a 20 20 20 20 20 20 20 20 69 66  t fd;.        if
365c0 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b  ( pFile->h>=0 ){
365d0 0a 20 20 20 20 20 20 20 20 20 20 72 6f 62 75 73  .          robus
365e0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70  t_close(pFile, p
365f0 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f  File->h, __LINE_
36600 5f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _);.        }.  
36610 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
36620 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20   -1;.        fd 
36630 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43  = robust_open(pC
36640 74 78 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  tx->dbPath, pFil
36650 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  e->openFlags, 0)
36660 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
36670 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
36680 4f 50 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29  OPEN  %d\n", fd)
36690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
366a0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d>=0 ){.        
366b0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b    pFile->h = fd;
366c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
366d0 20 20 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c            rc=SQL
366e0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
366f0 54 3b 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53  T; /* SQLITE_BUS
36700 59 3f 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  Y? proxyTakeConc
36710 68 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20  h called.       
36720 20 20 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69      during locki
36730 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ng */.        }.
36740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
36750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36760 26 26 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  && !pCtx->lockPr
36770 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63  oxy ){.        c
36780 68 61 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70  har *path = temp
36790 4c 6f 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c  LockPath ? tempL
367a0 6f 63 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e  ockPath : pCtx->
367b0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20  lockProxyPath;. 
367c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
367d0 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28  yCreateUnixFile(
367e0 70 61 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63  path, &pCtx->loc
367f0 6b 50 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20  kProxy, 1);.    
36800 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36810 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
36820 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79  ITE_NOMEM && try
36830 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  OldLockPath ){. 
36840 20 20 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63           /* we c
36850 6f 75 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74  ouldn't create t
36860 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
36870 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20  le with the old 
36880 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20  lock file path. 
36890 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
368a0 74 72 79 20 61 67 61 69 6e 20 76 69 61 20 61 75  try again via au
368b0 74 6f 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20  to-naming .     
368c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
368d0 20 20 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50     forceNewLockP
368e0 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ath = 1;.       
368f0 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74     tryOldLockPat
36900 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
36910 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f   continue; /* go
36920 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20   back to the do 
36930 7b 7d 20 77 68 69 6c 65 20 73 74 61 72 74 20 70  {} while start p
36940 6f 69 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20  oint, try again 
36950 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
36960 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
36970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36980 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
36990 74 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  to make a copy o
369a0 66 20 70 61 74 68 20 69 66 20 77 65 20 65 78 74  f path if we ext
369b0 72 61 63 74 65 64 20 74 68 65 20 76 61 6c 75 65  racted the value
369c0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f  .         ** fro
369d0 6d 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  m the conch file
369e0 20 6f 72 20 74 68 65 20 70 61 74 68 20 77 61 73   or the path was
369f0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
36a00 65 20 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20  e stack.        
36a10 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
36a20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a  tempLockPath ){.
36a30 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
36a40 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20  lockProxyPath = 
36a50 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
36a60 30 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29  0, tempLockPath)
36a70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36a80 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
36a90 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
36aa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36ab0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
36ac0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
36ad0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
36ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36af0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f          pCtx->co
36b00 6e 63 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20  nchHeld = 1;.   
36b10 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 69 66       .        if
36b20 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ( pCtx->lockProx
36b30 79 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61  y->pMethod == &a
36b40 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
36b50 20 20 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b           afpLock
36b60 69 6e 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43  ingContext *afpC
36b70 74 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  tx;.          af
36b80 70 43 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69  pCtx = (afpLocki
36b90 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78  ngContext *)pCtx
36ba0 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63  ->lockProxy->loc
36bb0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
36bc0 20 20 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64         afpCtx->d
36bd0 62 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f  bPath = pCtx->lo
36be0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
36bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65       }.      } e
36c00 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f  lse {.        co
36c10 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
36c20 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74  ->xUnlock((sqlit
36c30 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
36c40 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  le, NO_LOCK);.  
36c50 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
36c60 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20  ACE(("TAKECONCH 
36c70 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68   %d %s\n", conch
36c80 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
36c90 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
36ca0 54 45 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c  TE_OK?"ok":"fail
36cb0 65 64 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ed"));.      ret
36cc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68  urn rc;.    } wh
36cd0 69 6c 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63  ile (1); /* in c
36ce0 61 73 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ase we need to r
36cf0 65 74 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20  etry the :auto: 
36d00 6c 6f 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20  lock file - .   
36d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
36d20 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   we should never
36d30 20 67 65 74 20 68 65 72 65 20 65 78 63 65 70 74   get here except
36d40 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e   via the 'contin
36d50 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d  ue' call. */.  }
36d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69  .}../*.** If pFi
36d70 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  le holds a lock 
36d80 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c  on a conch file,
36d90 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68   then release th
36da0 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  at lock..*/.stat
36db0 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65  ic int proxyRele
36dc0 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c  aseConch(unixFil
36dd0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
36de0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36df0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
36e00 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f  outine return co
36e10 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  de */.  proxyLoc
36e20 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
36e30 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69  x;  /* The locki
36e40 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74  ng context for t
36e50 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f  he proxy lock */
36e60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
36e70 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f  chFile;        /
36e80 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
36e90 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  nch file */..  p
36ea0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36eb0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
36ec0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
36ed0 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20  xt;.  conchFile 
36ee0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
36ef0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  e;.  OSTRACE(("R
36f00 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20  ELEASECONCH  %d 
36f10 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
36f20 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
36f30 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78             (pCtx
36f40 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
36f50 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  ? pCtx->lockProx
36f60 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  yPath : ":auto:"
36f70 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 67  ), .           g
36f80 65 74 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28  etpid()));.  if(
36f90 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
36fa0 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  >0 ){.    rc = c
36fb0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
36fc0 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
36fd0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
36fe0 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
36ff0 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68   }.  pCtx->conch
37000 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52  Held = 0;.  OSTR
37010 41 43 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e  ACE(("RELEASECON
37020 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
37030 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
37040 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
37050 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
37060 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65  failed")));.  re
37070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37080 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  * Given the name
37090 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66   of a database f
370a0 69 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ile, compute the
370b0 20 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e   name of its con
370c0 63 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72  ch file..** Stor
370d0 65 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  e the conch file
370e0 6e 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  name in memory o
370f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
37100 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
37110 2a 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61  * Make *pConchPa
37120 74 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  th point to the 
37130 6e 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72  new name.  Retur
37140 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
37150 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c  uccess.** or SQL
37160 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61  ITE_NOMEM if una
37170 62 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65  ble to obtain me
37180 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
37190 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
371a0 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
371b0 6e 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ng that the allo
371c0 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  cated memory.** 
371d0 73 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61  space is eventua
371e0 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
371f0 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20   *pConchPath is 
37200 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61  set to NULL if a
37210 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
37220 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  on error occurs.
37230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37240 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50  roxyCreateConchP
37250 61 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62  athname(char *db
37260 50 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f  Path, char **pCo
37270 6e 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20  nchPath){.  int 
37280 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
37290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
372a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
372b0 6e 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74  nt len = (int)st
372c0 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a  rlen(dbPath); /*
372d0 20 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62   Length of datab
372e0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64  ase filename - d
372f0 62 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20  bPath */.  char 
37300 2a 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20  *conchPath;     
37310 20 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66           /* buff
37320 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63  er in which to c
37330 6f 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e  onstruct conch n
37340 61 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ame */..  /* All
37350 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
37360 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61  the conch filena
37370 6d 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  me and initializ
37380 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20  e the name to.  
37390 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** the name of t
373a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
373b0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a  base file. */  .
373c0 20 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20    *pConchPath = 
373d0 63 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61  conchPath = (cha
373e0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
373f0 6f 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69  oc(len + 8);.  i
37400 66 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20  f( conchPath==0 
37410 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
37420 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
37430 20 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61    memcpy(conchPa
37440 74 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b  th, dbPath, len+
37450 31 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20  1);.  .  /* now 
37460 69 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66  insert a "." bef
37470 6f 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63  ore the last / c
37480 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f  haracter */.  fo
37490 72 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e  r( i=(len-1); i>
374a0 3d 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69  =0; i-- ){.    i
374b0 66 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d  f( conchPath[i]=
374c0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b  ='/' ){.      i+
374d0 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
374e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63      }.  }.  conc
374f0 68 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20  hPath[i]='.';.  
37500 77 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b  while ( i<len ){
37510 0a 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69  .    conchPath[i
37520 2b 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20  +1]=dbPath[i];. 
37530 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
37540 2a 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63  * append the "-c
37550 6f 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20  onch" suffix to 
37560 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65  the file */.  me
37570 6d 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b  mcpy(&conchPath[
37580 69 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20  i+1], "-conch", 
37590 37 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  7);.  assert( (i
375a0 6e 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50  nt)strlen(conchP
375b0 61 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b  ath) == len+7 );
375c0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
375d0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b  E_OK;.}.../* Tak
375e0 65 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69  es a fully confi
375f0 67 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b  gured proxy lock
37600 69 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66  ing-style unix f
37610 69 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73  ile and switches
37620 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  .** the local lo
37630 63 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f  ck file path .*/
37640 0a 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74  .static int swit
37650 63 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28  chLockProxyPath(
37660 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
37670 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
37680 68 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  h) {.  proxyLock
37690 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
376a0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
376b0 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
376c0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
376d0 20 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20    char *oldPath 
376e0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
376f0 79 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20  yPath;.  int rc 
37700 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
37710 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
37720 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock!=NO_LOCK ){
37730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37740 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a  TE_BUSY;.  }  ..
37750 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
37760 64 6f 20 69 66 20 74 68 65 20 70 61 74 68 20 69  do if the path i
37770 73 20 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f  s NULL, :auto: o
37780 72 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 78  r matches the ex
37790 69 73 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20  isting path */. 
377a0 20 69 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61   if( !path || pa
377b0 74 68 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21  th[0]=='\0' || !
377c0 73 74 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61  strcmp(path, ":a
377d0 75 74 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f  uto:") ||.    (o
377e0 6c 64 50 61 74 68 20 26 26 20 21 73 74 72 6e 63  ldPath && !strnc
377f0 6d 70 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68  mp(oldPath, path
37800 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29  , MAXPATHLEN)) )
37810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37820 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
37830 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c  .    unixFile *l
37840 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d  ockProxy = pCtx-
37850 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20  >lockProxy;.    
37860 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d  pCtx->lockProxy=
37870 4e 55 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e  NULL;.    pCtx->
37880 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20  conchHeld = 0;. 
37890 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79     if( lockProxy
378a0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
378b0 72 63 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d  rc=lockProxy->pM
378c0 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73  ethod->xClose((s
378d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f  qlite3_file *)lo
378e0 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20  ckProxy);.      
378f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
37900 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
37910 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79  3_free(lockProxy
37920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
37930 69 74 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74  ite3_free(oldPat
37940 68 29 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f  h);.    pCtx->lo
37950 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71  ckProxyPath = sq
37960 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
37970 20 70 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20   path);.  }.  . 
37980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37990 2a 0a 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20  *.** pFile is a 
379a0 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65  file that has be
379b0 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70  en opened by a p
379c0 72 69 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e  rior xOpen call.
379d0 20 20 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61    dbPath.** is a
379e0 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 61   string buffer a
379f0 74 20 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c  t least MAXPATHL
37a00 45 4e 2b 31 20 63 68 61 72 61 63 74 65 72 73 20  EN+1 characters 
37a10 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  in size..**.** T
37a20 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64  his routine find
37a30 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73   the filename as
37a40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 46  sociated with pF
37a50 69 6c 65 20 61 6e 64 20 77 72 69 74 65 73 20 69  ile and writes i
37a60 74 0a 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e  t.** int dbPath.
37a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37a80 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
37a90 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
37aa0 65 20 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a  e *pFile, char *
37ab0 64 62 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66  dbPath){.#if def
37ac0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
37ad0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
37ae0 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65  thod == &afpIoMe
37af0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
37b00 61 66 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20  afp style keeps 
37b10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
37b20 68 65 20 64 62 20 70 61 74 68 20 69 6e 20 74 68  he db path in th
37b30 65 20 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64  e filePath field
37b40 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
37b50 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73  struct */.    as
37b60 73 65 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65  sert( (int)strle
37b70 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  n((char*)pFile->
37b80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c  lockingContext)<
37b90 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20  =MAXPATHLEN );. 
37ba0 20 20 20 73 74 72 6c 63 70 79 28 64 62 50 61 74     strlcpy(dbPat
37bb0 68 2c 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  h, ((afpLockingC
37bc0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
37bd0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
37be0 3e 64 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48  >dbPath, MAXPATH
37bf0 4c 45 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23  LEN);.  } else.#
37c00 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c  endif.  if( pFil
37c10 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64  e->pMethod == &d
37c20 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  otlockIoMethods 
37c30 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f  ){.    /* dot lo
37c40 63 6b 20 73 74 79 6c 65 20 75 73 65 73 20 74 68  ck style uses th
37c50 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
37c60 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64  t to store the d
37c70 6f 74 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66  ot lock.    ** f
37c80 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
37c90 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
37ca0 28 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e  ((char *)pFile->
37cb0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20  lockingContext) 
37cc0 2d 20 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b  - strlen(DOTLOCK
37cd0 5f 53 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65  _SUFFIX);.    me
37ce0 6d 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68  mcpy(dbPath, (ch
37cf0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
37d00 69 6e 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20  ingContext, len 
37d10 2b 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 1);.  }else{. 
37d20 20 20 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20     /* all other 
37d30 73 74 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c  styles use the l
37d40 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74  ocking context t
37d50 6f 20 73 74 6f 72 65 20 74 68 65 20 64 62 20 66  o store the db f
37d60 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20  ile path */.    
37d70 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28  assert( strlen((
37d80 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  char*)pFile->loc
37d90 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41  kingContext)<=MA
37da0 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20  XPATHLEN );.    
37db0 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20  strlcpy(dbPath, 
37dc0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
37dd0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d  ockingContext, M
37de0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a  AXPATHLEN);.  }.
37df0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37e00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b  OK;.}../*.** Tak
37e10 65 73 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69  es an already fi
37e20 6c 6c 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c  lled in unix fil
37e30 65 20 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20  e and alters it 
37e40 73 6f 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b  so all file lock
37e50 69 6e 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ing .** will be 
37e60 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
37e70 20 6c 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63   local proxy loc
37e80 6b 20 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c  k file.  The fol
37e90 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a  lowing fields.**
37ea0 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20 69   are preserved i
37eb0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
37ec0 6e 74 65 78 74 20 73 6f 20 74 68 61 74 20 74 68  ntext so that th
37ed0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
37ee0 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75  ed and .** the u
37ef0 6e 69 78 20 73 74 72 75 63 74 75 72 65 20 70 72  nix structure pr
37f00 6f 70 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75  operly cleaned u
37f10 70 20 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a  p at close time:
37f20 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  .**  ->lockingCo
37f30 6e 74 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74  ntext.**  ->pMet
37f40 68 6f 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  hod.*/.static in
37f50 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
37f60 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
37f70 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20  e *pFile, const 
37f80 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20  char *path) {.  
37f90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37fa0 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61  ext *pCtx;.  cha
37fb0 72 20 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48  r dbPath[MAXPATH
37fc0 4c 45 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a  LEN+1];       /*
37fd0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
37fe0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
37ff0 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e  char *lockPath=N
38000 55 4c 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ULL;.  int rc = 
38010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20  SQLITE_OK;.  .  
38020 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
38030 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock!=NO_LOCK ){
38040 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38050 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
38060 72 6f 78 79 47 65 74 44 62 50 61 74 68 46 6f 72  roxyGetDbPathFor
38070 55 6e 69 78 46 69 6c 65 28 70 46 69 6c 65 2c 20  UnixFile(pFile, 
38080 64 62 50 61 74 68 29 3b 0a 20 20 69 66 28 20 21  dbPath);.  if( !
38090 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d  path || path[0]=
380a0 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63 6d 70  ='\0' || !strcmp
380b0 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29  (path, ":auto:")
380c0 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68   ){.    lockPath
380d0 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  =NULL;.  }else{.
380e0 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68      lockPath=(ch
380f0 61 72 20 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20  ar *)path;.  }. 
38100 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52   .  OSTRACE(("TR
38110 41 4e 53 50 52 4f 58 59 20 20 25 64 20 66 6f 72  ANSPROXY  %d for
38120 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70   %s pid=%d\n", p
38130 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
38140 20 20 20 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20      (lockPath ? 
38150 6c 6f 63 6b 50 61 74 68 20 3a 20 22 3a 61 75 74  lockPath : ":aut
38160 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
38170 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69  ;..  pCtx = sqli
38180 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
38190 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 69  of(*pCtx) );.  i
381a0 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
381b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
381c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
381d0 73 65 74 28 70 43 74 78 2c 20 30 2c 20 73 69 7a  set(pCtx, 0, siz
381e0 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a 0a 20 20  eof(*pCtx));..  
381f0 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
38200 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 64 62  ConchPathname(db
38210 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
38220 63 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 69  chFilePath);.  i
38230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38240 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 6f   ){.    rc = pro
38250 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
38260 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
38270 50 61 74 68 2c 20 26 70 43 74 78 2d 3e 63 6f 6e  Path, &pCtx->con
38280 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  chFile, 0);.    
38290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
382a0 41 4e 54 4f 50 45 4e 20 26 26 20 28 28 70 46 69  ANTOPEN && ((pFi
382b0 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f  le->openFlags&O_
382c0 52 44 57 52 29 20 3d 3d 20 30 29 20 29 7b 0a 20  RDWR) == 0) ){. 
382d0 20 20 20 20 20 2f 2a 20 69 66 20 28 61 29 20 74       /* if (a) t
382e0 68 65 20 6f 70 65 6e 20 66 6c 61 67 73 20 61 72  he open flags ar
382f0 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c 20 28 62  e not O_RDWR, (b
38300 29 20 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27  ) the conch isn'
38310 74 20 74 68 65 72 65 2c 20 61 6e 64 0a 20 20 20  t there, and.   
38320 20 20 20 2a 2a 20 28 63 29 20 74 68 65 20 66 69     ** (c) the fi
38330 6c 65 20 73 79 73 74 65 6d 20 69 73 20 72 65 61  le system is rea
38340 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20 65 6e 61  d-only, then ena
38350 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61  ble no-locking a
38360 63 63 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  ccess..      ** 
38370 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f 52 44 4f  Ugh, since O_RDO
38380 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77 65 20 74  NLY==0x0000 we t
38390 65 73 74 20 66 6f 72 20 21 4f 5f 52 44 57 52 20  est for !O_RDWR 
383a0 73 69 6e 63 65 20 75 6e 69 78 4f 70 65 6e 20 61  since unixOpen a
383b0 73 73 65 72 74 73 0a 20 20 20 20 20 20 2a 2a 20  sserts.      ** 
383c0 74 68 61 74 20 6f 70 65 6e 46 6c 61 67 73 20 77  that openFlags w
383d0 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e  ill have only on
383e0 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72  e of O_RDONLY or
383f0 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20 20 20 2a   O_RDWR..      *
38400 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
38410 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
38420 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
38430 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20 20 20 20  conchInfo;.     
38440 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65 73 73 20   int goLockless 
38450 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
38460 6f 73 53 74 61 74 28 70 43 74 78 2d 3e 63 6f 6e  osStat(pCtx->con
38470 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f 6e  chFilePath, &con
38480 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  chInfo) == -1 ) 
38490 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72  {.        int er
384a0 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  r = errno;.     
384b0 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e 4f     if( (err==ENO
384c0 45 4e 54 29 20 26 26 20 28 73 74 61 74 66 73 28  ENT) && (statfs(
384d0 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  dbPath, &fsInfo)
384e0 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20 20   != -1) ){.     
384f0 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73 20       goLockless 
38500 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  = (fsInfo.f_flag
38510 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d 3d  s&MNT_RDONLY) ==
38520 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   MNT_RDONLY;.   
38530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
38540 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b 6c       if( goLockl
38550 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
38560 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
38570 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e 6c   -1; /* read onl
38580 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20 2a  y FS/ lockless *
38590 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d