/ Hex Artifact Content
Login

Artifact 75ce49309b8352c7173ce1ef6fc9e8d1f6daab10:


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 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1200: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
1210: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1220: 5f 53 49 5a 45 3e 30 0a 23 69 6e 63 6c 75 64 65  _SIZE>0.#include
1230: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1240: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1250: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1260: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1270: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1280: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1290: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
12a0: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
12b0: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12c0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12d0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12e0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12f0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
1300: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1310: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1320: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1330: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1340: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1350: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1360: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1370: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1380: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1390: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
13a0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
13b0: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13c0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13d0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13e0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13f0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
1400: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
1410: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1420: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1430: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1440: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1450: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1460: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1470: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1480: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1490: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
14a0: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
14b0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14c0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14e0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14f0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
1500: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
1510: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1520: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1530: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1540: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1550: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1560: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1570: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1580: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1590: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
15a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
15b0: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15c0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15e0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15f0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
1600: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1610: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1620: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1630: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1640: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1650: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1660: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1670: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1680: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1690: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
16a0: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
16b0: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16c0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16d0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16e0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16f0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
1700: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
1710: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1720: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1730: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1740: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1760: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1770: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1780: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1790: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
17a0: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
17b0: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17c0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17d0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17e0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17f0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
1800: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
1810: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1820: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1830: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1840: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1850: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1860: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1870: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1880: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1890: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
18a0: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
18b0: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18c0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18d0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18f0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
1900: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
1910: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1920: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1930: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1940: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1950: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1960: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1970: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1980: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1990: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
19a0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
19b0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19c0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19d0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19e0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19f0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
1a00: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
1a10: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a20: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a40: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a60: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a70: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a80: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a90: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1aa0: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1ab0: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1ac0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ad0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ae0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1af0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b00: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1b10: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b20: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b40: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b60: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b70: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b80: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b90: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1ba0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1bb0: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1bc0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bd0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1c00: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1c10: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c20: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c30: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c40: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c50: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c60: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c70: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c80: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c90: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1ca0: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1cb0: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cd0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1ce0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cf0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1d00: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d20: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d30: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d40: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d50: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d60: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d70: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d80: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d90: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1dc0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1dd0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1df0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1e00: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1e10: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e40: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e50: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 20 20 69  HUNK_SIZE */.  i
1e60: 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20  nt nFetchOut;   
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1ea0: 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c  ch refs */.  sql
1eb0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1ec0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1ed0: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
1ee0: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1ef0: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1f00: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1f10: 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
1f20: 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65    /* Actual size
1f30: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1f40: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1f50: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1f60: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20  pSizeMax;       
1f70: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1f80: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1f90: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64   value */.  void
1fa0: 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20   *pMapRegion;   
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
1fd0: 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 69 66 64 65   region */.#ifde
1fe0: 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69  f __QNXNTO__.  i
1ff0: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63     /* Device sec
2020: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
2030: 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65  t deviceCharacte
2040: 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20  ristics;        
2050: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64    /* Precomputed
2060: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
2070: 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e 64 69  ristics */.#endi
2080: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
2090: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20a0: 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  E.  int openFlag
20b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
20d0: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61  lags specified a
20e0: 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64  t open() */.#end
20f0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
2100: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2110: 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  LE || defined(__
2120: 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67  APPLE__).  unsig
2130: 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20  ned fsFlags;    
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2150: 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73  * cached details
2160: 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a   from statfs() *
2170: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
2180: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2190: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
21a0: 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  pId;          /*
21b0: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
21c0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
21d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21e0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  /* The next grou
21f0: 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61  p of variables a
2200: 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b  re used to track
2210: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2220: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
2230: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20  tion counter in 
2240: 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64  bytes 24-27 of d
2250: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
2260: 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77  e updated.  ** w
2270: 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74  henever any part
2280: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2290: 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73   changes.  An as
22a0: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
22b0: 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66  ll.  ** occur if
22c0: 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74   a file is updat
22d0: 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20  ed without also 
22e0: 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61  updating the tra
22f0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
2300: 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73  unter.  This tes
2310: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f  t is made to avo
2320: 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20  id new problems 
2330: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
2340: 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65   ** one describe
2350: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38  d by ticket #358
2360: 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67  4. .  */.  unsig
2370: 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e  ned char transCn
2380: 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75  trChng;   /* Tru
2390: 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
23a0: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61  tion counter cha
23b0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
23c0: 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65  ed char dbUpdate
23d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
23e0: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
23f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2400: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2410: 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61  ned char inNorma
2420: 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75  lWrite;   /* Tru
2430: 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  e if in a normal
2440: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
2450: 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66   */..#endif..#if
2460: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2470: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2480: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2490: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
24a0: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
24b0: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
24c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
24d0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
24e0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
24f0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
2500: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
2510: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2520: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2530: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2540: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2550: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2560: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2570: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2580: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2590: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
25a0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
25b0: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
25c0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
25d0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
25e0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
25f0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
2600: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
2610: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2620: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2630: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2640: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2650: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2660: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2670: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2680: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2690: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
26a0: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
26b0: 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  0.#endif.#define
26c0: 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20   UNIXFILE_PSOW  
26d0: 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f        0x10     /
26e0: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
26f0: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2700: 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  TE */.#define UN
2710: 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20  IXFILE_DELETE   
2720: 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44     0x20     /* D
2730: 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  elete on close *
2740: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2750: 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30  LE_URI         0
2760: 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e  x40     /* Filen
2770: 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71  ame might have q
2780: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
2790: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
27a0: 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20  ILE_NOLOCK      
27b0: 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e  0x80     /* Do n
27c0: 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  o file locking *
27d0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
27e0: 4c 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30  LE_WARNED    0x0
27f0: 31 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66  100     /* verif
2800: 79 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e  yDbFile() warnin
2810: 67 73 20 68 61 76 65 20 62 65 65 6e 20 69 73 73  gs have been iss
2820: 75 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ued */../*.** In
2830: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2840: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2850: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2860: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2870: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2880: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
2890: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
28a0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
28b0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
28c0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
28d0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
28e0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
28f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2900: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2910: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2920: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2930: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2940: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2950: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2960: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2970: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2980: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
2990: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
29a0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
29b0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
29c0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
29d0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
29e0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
29f0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2a00: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2a10: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2a20: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2a30: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2a40: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2a50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2a60: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2a70: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2a80: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
2a90: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
2aa0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
2ab0: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
2ac0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
2ad0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
2ae0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2af0: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2b00: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2b10: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2b20: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2b30: 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ./*.** Different
2b40: 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65   Unix systems de
2b50: 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20  clare open() in 
2b60: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20  different ways. 
2b70: 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65   Same use.** ope
2b80: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2b90: 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65  t,mode_t).  Othe
2ba0: 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73  rs use open(cons
2bb0: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29  t char*,int,...)
2bc0: 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
2bd0: 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  nce is important
2be0: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f   when using a po
2bf0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
2c00: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
2c10: 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64   safest way to d
2c20: 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f  eal with the pro
2c30: 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79  blem is to alway
2c40: 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70  s use this wrapp
2c50: 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61  er.** which alwa
2c60: 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ys has the same 
2c70: 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74  well-defined int
2c80: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
2c90: 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28  c int posixOpen(
2ca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2cb0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
2cc0: 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  t mode){.  retur
2cd0: 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c  n open(zFile, fl
2ce0: 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f  ags, mode);.}../
2cf0: 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73  *.** On some sys
2d00: 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66  tems, calls to f
2d10: 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69  chown() will tri
2d20: 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20 69  gger a message i
2d30: 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20  n a security.** 
2d40: 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65  log if they come
2d50: 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70   from non-root p
2d60: 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76  rocesses.  So av
2d70: 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f  oid calling fcho
2d80: 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72  wn() if.** we ar
2d90: 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73  e not running as
2da0: 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   root..*/.static
2db0: 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f 77 6e   int posixFchown
2dc0: 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75  (int fd, uid_t u
2dd0: 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a  id, gid_t gid){.
2de0: 20 20 72 65 74 75 72 6e 20 67 65 74 65 75 69 64    return geteuid
2df0: 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77 6e 28  () ? 0 : fchown(
2e00: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a  fd,uid,gid);.}..
2e10: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
2e20: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
2e30: 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
2e40: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e  (const char*, in
2e50: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  t*);../*.** Many
2e60: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2e70: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2e80: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2e90: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2ea0: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2eb0: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2ec0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2ed0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2ee0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2ef0: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2f00: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2f10: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2f20: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2f30: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2f40: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2f50: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2f60: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2f70: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2fa0: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2fb0: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2fc0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
2fd0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
2fe0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2ff0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
3000: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
3010: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3020: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3030: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3040: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
3050: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3060: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3070: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
3080: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
3090: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
30a0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
30b0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
30c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
30d0: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
30e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
30f0: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
3100: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
3110: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
3120: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
3130: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3140: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
3150: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3160: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
3170: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3180: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3190: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
31a0: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
31b0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
31c0: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
31d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31e0: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
31f0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3200: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
3210: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3220: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
3230: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3240: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
3250: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3260: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
3270: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3280: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3290: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
32a0: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
32b0: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
32c0: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
32d0: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
32e0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
32f0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
3300: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
3310: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3320: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
3330: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
3340: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
3350: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
3360: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
3370: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
3380: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3390: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
33a0: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
33b0: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
33c0: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
33d0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
33e0: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
33f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3400: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3410: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3420: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
3430: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
3440: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3450: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
3460: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3470: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
3480: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3490: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
34a0: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
34b0: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
34c0: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
34d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
34e0: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
34f0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
3500: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
3510: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3520: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
3530: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
3540: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3550: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
3560: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3570: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
3580: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3590: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
35a0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
35b0: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
35c0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
35d0: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
35e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
35f0: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
3600: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3610: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3620: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
3630: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3640: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
3650: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3660: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
3670: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
3680: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3690: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
36a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
36b0: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
36c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36d0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
36e0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
36f0: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
3700: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3710: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3720: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
3730: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3740: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3750: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
3760: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
3770: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3780: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3790: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
37a0: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
37b0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
37c0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
37d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
37e0: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
37f0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
3800: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3810: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3820: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
3830: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
3840: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3850: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
3860: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
3870: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
3880: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3890: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
38a0: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
38b0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
38c0: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
38d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
38e0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
38f0: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3900: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3910: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3920: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3930: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3940: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3950: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3960: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3970: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
3980: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3990: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
39a0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
39d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
39e0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
39f0: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3a00: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3a10: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3a20: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3a30: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3a40: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3a50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3a60: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3a70: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3a80: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3a90: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3aa0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3ab0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3ad0: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3ae0: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3af0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3b00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3b10: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3b20: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b30: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b40: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b50: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b60: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3b70: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3b80: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3b90: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3ba0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3bb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bc0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3bd0: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3be0: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3bf0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c00: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c20: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c30: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c40: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c50: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3c70: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3c80: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3c90: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3ca0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3cb0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cc0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3cd0: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3ce0: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3cf0: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d00: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d10: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d20: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d30: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d40: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d50: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d60: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3d70: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3d80: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3d90: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3da0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3dc0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3dd0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3de0: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3df0: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e10: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e30: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e40: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e50: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e60: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3e70: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3e80: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3e90: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3ea0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3eb0: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3ec0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3ed0: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3ee0: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3ef0: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3f00: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
3f10: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
3f20: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3f30: 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30  _ptr)mmap,     0
3f40: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d   },.#define osMm
3f50: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
3f60: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
3f70: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
3f80: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3f90: 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61  ent)..  { "munma
3fa0: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3fb0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3fc0: 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  unmap,          
3fd0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d  0 },.#define osM
3fe0: 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  unmap ((void*(*)
3ff0: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
4000: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
4010: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
4020: 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d  MREMAP.  { "mrem
4030: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
4040: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4050: 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mremap,         
4060: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4070: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4080: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4090: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40b0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d  f.#define osMrem
40c0: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
40d0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f  id*,size_t,size_
40e0: 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63  t,int,...))aSysc
40f0: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
4100: 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  )..}; /* End of 
4110: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
4120: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
4130: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4140: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
4150: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
4160: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
4170: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e  ll of the.** "un
4180: 69 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  ix" VFSes.  Retu
4190: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
41a0: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
41b0: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
41c0: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
41d0: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
41e0: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
41f0: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
4200: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
4210: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
4220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
4230: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xSetSystemCall(.
4240: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4250: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
4260: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
4270: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
4280: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4290: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
42a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
42b0: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
42c0: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
42d0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
42e0: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
42f0: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
4300: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
4310: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4320: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
4330: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
4340: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4350: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
4360: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
4370: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
4380: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
4390: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
43a0: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
43b0: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
43c0: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
43d0: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
43e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
43f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4400: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4410: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4420: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4430: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4440: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
4450: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
4460: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
4470: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4480: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
4490: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
44a0: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
44b0: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
44c0: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
44d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
44e0: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
44f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
4500: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
4510: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
4520: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
4530: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
4540: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
4550: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
4560: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
4570: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4580: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
4590: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
45a0: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
45b0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
45c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
45e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
45f0: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
4600: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
4610: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4620: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
4630: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
4640: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
4650: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4660: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4670: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
4680: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
4690: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
46a0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
46b0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
46c0: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
46d0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
46e0: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
46f0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
4700: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
4710: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
4720: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
4730: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4740: 72 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43  r unixGetSystemC
4750: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
4760: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
4770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4780: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
4790: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
47a0: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
47b0: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
47c0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
47d0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
47e0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
47f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4800: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4810: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
4820: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
4830: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
4840: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4850: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
4860: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
4870: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
4880: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
4890: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
48a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
48b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
48c0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
48d0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
48e0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
48f0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
4900: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
4910: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
4920: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
4930: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
4940: 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78  st char *unixNex
4950: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
4960: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
4970: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
4980: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
4990: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
49a0: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
49b0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
49c0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
49d0: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
49e0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
49f0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
4a00: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
4a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4a20: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
4a30: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4a40: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
4a50: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
4a60: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
4a70: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
4a80: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
4a90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
4aa0: 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44  nvoke open().  D
4ab0: 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69  o so multiple ti
4ac0: 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65 69  mes, until it ei
4ad0: 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f 72  ther succeeds or
4ae0: 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73 6f  .** fails for so
4af0: 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72 20  me reason other 
4b00: 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a  than EINTR..**.*
4b10: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63 72  * If the file cr
4b20: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20  eation mode "m" 
4b30: 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69 74  is 0 then set it
4b40: 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
4b50: 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20  for.** SQLite.  
4b60: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 53  The default is S
4b70: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
4b80: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 28  LE_PERMISSIONS (
4b90: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34  normally.** 0644
4ba0: 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79  ) as modified by
4bb0: 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61 73   the system umas
4bc0: 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74 20  k.  If m is not 
4bd0: 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20  0, then.** make 
4be0: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
4bf0: 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74 6c  n mode be exactl
4c00: 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68 65  y m ignoring the
4c10: 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   umask..**.** Th
4c20: 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77 69  e m parameter wi
4c30: 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  ll be non-zero o
4c40: 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e  nly when creatin
4c50: 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c  g -wal, -journal
4c60: 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69  ,.** and -shm fi
4c70: 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74 68  les.  We want th
4c80: 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61 76  ose files to hav
4c90: 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65 20  e *exactly* the 
4ca0: 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69  same.** permissi
4cb0: 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72 69  ons as their ori
4cc0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20  ginal database, 
4cd0: 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62 79  unadulterated by
4ce0: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49   the umask..** I
4cf0: 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20 61  n that way, if a
4d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
4d10: 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d  s -rw-rw-rw or -
4d20: 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a  rw-rw-r-, and a.
4d30: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
4d40: 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76 65  rashes and leave
4d50: 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75  s behind hot jou
4d60: 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a  rnals, then any.
4d70: 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  ** process that 
4d80: 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65  is able to write
4d90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4da0: 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62   will also be ab
4db0: 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72  le to.** recover
4dc0: 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
4dd0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4de0: 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e   robust_open(con
4df0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4e00: 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20  f, mode_t m){.  
4e10: 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74  int fd;.  mode_t
4e20: 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51   m2 = m ? m : SQ
4e30: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
4e40: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
4e50: 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
4e60: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
4e70: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
4e80: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
4e90: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
4ea0: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
4eb0: 6e 64 69 66 0a 20 20 7d 77 68 69 6c 65 28 20 66  ndif.  }while( f
4ec0: 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  d<0 && errno==EI
4ed0: 4e 54 52 20 29 3b 0a 20 20 69 66 28 20 66 64 3e  NTR );.  if( fd>
4ee0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
4ef0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
4f00: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
4f10: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
4f20: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
4f30: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
4f40: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
4f50: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
4f60: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
4f70: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
4f80: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
4f90: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
4fa0: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
4fb0: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
4fc0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
4fd0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
4fe0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
4ff0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
5000: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5010: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5020: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5040: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5050: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5060: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5070: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5080: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5090: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
50a0: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
50b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
50c0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
50d0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
50e0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
50f0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
5100: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5110: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5120: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5130: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5140: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5150: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5160: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5170: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5180: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5190: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
51a0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
51b0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
51c0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
51d0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
51e0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
51f0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
5200: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5210: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5220: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5230: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5240: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5250: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5260: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5270: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
5280: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
5290: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
52a0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
52b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
52c0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
52d0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
52e0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
52f0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
5300: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
5310: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
5320: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
5330: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5340: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
5350: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5360: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
5370: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
5380: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5390: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
53a0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
53b0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
53c0: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
53d0: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
53e0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
53f0: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
5400: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
5410: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
5420: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
5430: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5440: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5450: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5460: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
5470: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
5480: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
5490: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
54a0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
54b0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
54c0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
54d0: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
54e0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
54f0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
5500: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
5510: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5520: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5530: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5540: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5550: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5560: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
5570: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
5580: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5590: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
55a0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
55b0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
55c0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
55d0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
55e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
55f0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
5600: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
5610: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
5620: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5630: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5640: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5650: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5660: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
5670: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
5680: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
5690: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
56a0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
56b0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
56c0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
56d0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
56e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
56f0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
5700: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
5710: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
5720: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5730: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5740: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5750: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5760: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5770: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5780: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5790: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
57a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
57b0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
57c0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
57d0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
57e0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
57f0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
5800: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5810: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5820: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5830: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5840: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5850: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5860: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5870: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5880: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5890: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
58a0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
58b0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
58c0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
58d0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
58e0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
58f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
5900: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5910: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5920: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5930: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5940: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5950: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5960: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
5970: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
5980: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
5990: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
59a0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
59b0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
59c0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
59d0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
59e0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
59f0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
5a00: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
5a10: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
5a20: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5a30: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
5a40: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5a50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5a60: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5a70: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5a80: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5a90: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5aa0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5ab0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5ac0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5ad0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5ae0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
5af0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5b00: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
5b10: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
5b20: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
5b30: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
5b40: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5b50: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5b60: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5b70: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5b80: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5b90: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5ba0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5bb0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5bc0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5bd0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5be0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
5bf0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
5c00: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
5c10: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
5c20: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
5c30: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
5c40: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5c50: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
5c60: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
5c70: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
5c80: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
5c90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5ca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5cb0: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
5cc0: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
5cd0: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
5ce0: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
5cf0: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
5d00: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
5d10: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
5d20: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
5d30: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
5d40: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
5d50: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
5d60: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
5d70: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
5d80: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
5d90: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
5da0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5db0: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
5dc0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
5dd0: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
5de0: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
5df0: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
5e00: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
5e10: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
5e20: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
5e30: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
5e40: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
5e50: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
5e60: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
5e70: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
5e80: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
5e90: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
5ea0: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
5eb0: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
5ec0: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
5ed0: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
5ee0: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
5ef0: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
5f00: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
5f10: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
5f20: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
5f30: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
5f40: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
5f50: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
5f60: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
5f70: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
5f80: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
5f90: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
5fa0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
5fb0: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
5fc0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
5fd0: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
5fe0: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
5ff0: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
6000: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
6010: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
6020: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
6030: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
6040: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
6050: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
6060: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
6070: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
6080: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
6090: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
60a0: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
60b0: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
60c0: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
60d0: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
60e0: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
60f0: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
6100: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
6110: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
6120: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
6130: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
6140: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
6150: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
6160: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6170: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6180: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6190: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
61a0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
61b0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
61c0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
61d0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
61e0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
61f0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6200: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
6210: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6220: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6230: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6240: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
6250: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
6260: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
6270: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
6280: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
6290: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
62a0: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
62b0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62c0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62d0: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
62e0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
62f0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
6300: 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c  || .        (sql
6310: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6320: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
6330: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c   ||.        (sql
6340: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6350: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6360: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
6370: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6380: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
6390: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
63a0: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
63b0: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
63c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
63d0: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
63e0: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
63f0: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
6400: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
6410: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
6420: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
6430: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
6440: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
6450: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
6460: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
6470: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
6480: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
6490: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
64a0: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
64b0: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
64c0: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
64d0: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
64e0: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
64f0: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
6500: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
6510: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
6520: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
6530: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
6540: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
6550: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
6560: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
6570: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
6580: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
6590: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
65a0: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
65b0: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
65c0: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
65d0: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
65e0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
65f0: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
6600: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
6610: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
6620: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
6630: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
6640: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
6650: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
6660: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
6670: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6680: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6690: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
66a0: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
66b0: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
66c0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
66d0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
66e0: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
66f0: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
6700: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
6710: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
6720: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
6730: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
6740: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6760: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
6770: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
6780: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
6790: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
67a0: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
67b0: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
67c0: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
67d0: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
67e0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
67f0: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
6800: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
6810: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
6820: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
6830: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6880: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6890: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
68a0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
68b0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
68c0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
68d0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
68e0: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
68f0: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
6900: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
6910: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
6920: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
6930: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
6940: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6950: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
6960: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
6970: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
6980: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
6990: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
69a0: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
69b0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
69c0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
69d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
69e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
69f0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
6a00: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
6a10: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
6a20: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
6a30: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
6a40: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
6a50: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
6a60: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
6a70: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
6a80: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
6a90: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
6aa0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
6ab0: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
6ac0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6ad0: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
6ae0: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
6af0: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
6b00: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
6b10: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
6b20: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
6b30: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
6b40: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
6b50: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
6b60: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
6b70: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
6b80: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
6b90: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
6ba0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
6bb0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6bc0: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
6bd0: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
6be0: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
6bf0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6c20: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
6c30: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
6c40: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
6c50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6c60: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
6c70: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
6c80: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
6c90: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
6ca0: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
6cb0: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
6cc0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6cd0: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
6ce0: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
6cf0: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
6d00: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
6d10: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
6d20: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
6d30: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6d40: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
6d50: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
6d60: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
6d70: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
6d80: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
6d90: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
6da0: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
6db0: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
6dc0: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
6dd0: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
6de0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
6df0: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
6e00: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
6e10: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
6e20: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
6e30: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
6e40: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
6e50: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
6e60: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
6e70: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
6e80: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
6e90: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
6ea0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
6eb0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
6ec0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
6ed0: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
6ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
6ef0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6f00: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
6f10: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
6f20: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
6f30: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
6f40: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
6f50: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
6f60: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
6f70: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6f80: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
6f90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
6fa0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
6fb0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
6fc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
6fd0: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6fe0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6ff0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
7000: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
7010: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
7020: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
7030: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
7040: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
7050: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7060: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
7070: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
7080: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
7090: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
70a0: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
70b0: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
70c0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
70d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
70e0: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
70f0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
7100: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
7110: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7120: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
7130: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7140: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
7150: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
7160: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
7170: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
7180: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
7190: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
71a0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
71b0: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
71c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
71d0: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
71e0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
71f0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
7200: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
7210: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
7220: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
7230: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7240: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
7250: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
7260: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
7270: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
7280: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
7290: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
72a0: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
72b0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
72c0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
72d0: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
72e0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
72f0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7300: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
7310: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
7320: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
7330: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
7340: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
7370: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
7380: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
7390: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
73a0: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
73b0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
73c0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
73d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
73e0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
73f0: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
7400: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7410: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7420: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7430: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
7440: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
7450: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7460: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
7470: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
7480: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
7490: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
74a0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
74b0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
74c0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
74d0: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
74e0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
74f0: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
7500: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
7510: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7520: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
7530: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
7540: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7550: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
7560: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
7570: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
7580: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
7590: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
75a0: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
75b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
75c0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
75d0: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
75e0: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
75f0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
7600: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
7610: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
7620: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
7630: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
7640: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
7650: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
7660: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
7670: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
7680: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
7690: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
76a0: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
76b0: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
76c0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
76d0: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
76e0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
76f0: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
7700: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
7710: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
7720: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
7730: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7740: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
7750: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
7760: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7770: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
7780: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
7790: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
77a0: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
77b0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
77c0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
77d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
77e0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
77f0: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
7800: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
7810: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7820: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
7830: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
7840: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
7850: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
7860: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
7870: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
7880: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
7890: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
78a0: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
78b0: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
78c0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
78d0: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
78e0: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
78f0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
7900: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
7910: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7920: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
7930: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
7940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
7950: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
7960: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
7970: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
79e0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
79f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a30: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73  ************ Pos
7a50: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
7a60: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
7a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a80: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
7a90: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
7aa0: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
7ab0: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
7ac0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
7ad0: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
7ae0: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
7af0: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
7b00: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
7b10: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
7b20: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
7b30: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
7b40: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
7b50: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
7b60: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
7b70: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
7b80: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
7b90: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
7ba0: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
7bb0: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
7bc0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7bd0: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
7be0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
7bf0: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
7c00: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
7c10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
7c20: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
7c30: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
7c40: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7c50: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
7c60: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
7c70: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
7c80: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
7c90: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
7ca0: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
7cb0: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
7cc0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
7cd0: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
7ce0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
7cf0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
7d00: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
7d10: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7d20: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
7d30: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
7d40: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
7d50: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
7d60: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
7d70: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
7d80: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
7d90: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
7da0: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
7db0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
7dc0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
7dd0: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
7de0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
7df0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
7e00: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
7e10: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
7e20: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
7e30: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
7e40: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
7e50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
7e60: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
7e70: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
7e80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
7e90: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
7ea0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
7eb0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
7ec0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
7ed0: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
7ee0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
7ef0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
7f00: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
7f10: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
7f20: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
7f30: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
7f40: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
7f50: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
7f60: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
7f70: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
7f80: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
7f90: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
7fa0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
7fb0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
7fc0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
7fd0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
7fe0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
7ff0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
8000: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
8010: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
8020: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
8030: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
8040: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
8050: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
8060: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
8070: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
8080: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
8090: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
80a0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
80b0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
80c0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
80d0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
80e0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
80f0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
8100: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
8110: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
8120: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
8130: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
8140: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
8150: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
8160: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
8170: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
8180: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
8190: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
81a0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
81b0: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
81c0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
81d0: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
81e0: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
81f0: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
8200: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
8210: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
8220: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
8230: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
8240: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
8250: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
8260: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
8270: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
8280: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
8290: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
82a0: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
82b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
82c0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
82d0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
82e0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
82f0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
8300: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8310: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8320: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
8330: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
8340: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
8350: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
8360: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
8370: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
8380: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
8390: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
83a0: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
83b0: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
83c0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
83d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
83e0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
83f0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
8400: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
8410: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
8420: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
8430: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
8440: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
8450: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
8460: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
8470: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
8480: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
8490: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
84a0: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
84b0: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
84c0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
84d0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
84e0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
84f0: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
8500: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
8510: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
8520: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
8530: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
8540: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
8550: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
8560: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
8570: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
8580: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
8590: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
85a0: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
85b0: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
85c0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
85d0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
85e0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
85f0: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
8600: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
8610: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
8620: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
8630: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
8640: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
8650: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
8660: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
8670: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
8680: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
8690: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
86a0: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
86b0: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
86c0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
86d0: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
86e0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
86f0: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
8700: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
8710: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
8720: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8730: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
8740: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
8750: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
8760: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
8770: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
8780: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
8790: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
87a0: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
87b0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
87c0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
87d0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
87e0: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
87f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8800: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
8810: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
8820: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
8830: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
8840: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
8850: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
8860: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
8870: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
8880: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
8890: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
88a0: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
88b0: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
88c0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
88d0: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
88e0: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
88f0: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
8900: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
8910: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
8920: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
8930: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
8940: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
8950: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
8960: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
8970: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
8980: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
8990: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
89a0: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
89b0: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
89c0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
89d0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
89e0: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
89f0: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
8a00: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
8a10: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
8a20: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
8a30: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
8a40: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
8a50: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
8a60: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
8a70: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
8a80: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
8a90: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
8aa0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
8ab0: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
8ac0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
8ad0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
8ae0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
8af0: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
8b00: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
8b10: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
8b20: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8b30: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
8b40: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
8b50: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
8b60: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
8b70: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
8b80: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
8b90: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
8ba0: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
8bb0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
8bc0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
8bd0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
8be0: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
8bf0: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
8c00: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
8c10: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
8c20: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
8c30: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
8c40: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
8c50: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
8c60: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
8c70: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
8c80: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
8c90: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
8ca0: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
8cb0: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
8cc0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
8cd0: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
8ce0: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
8cf0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
8d00: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
8d10: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
8d20: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
8d30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
8d40: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
8d50: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
8d60: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
8d70: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
8d80: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
8d90: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
8da0: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
8db0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
8dc0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
8dd0: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
8de0: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
8df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
8e00: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
8e10: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
8e20: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
8e30: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
8e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8e50: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
8e60: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
8e70: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8e80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8e90: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
8ea0: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
8eb0: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
8ec0: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
8ed0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
8ee0: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
8ef0: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
8f00: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
8f10: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
8f20: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
8f30: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
8f40: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
8f50: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
8f60: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
8f70: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
8f80: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
8f90: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
8fa0: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
8fb0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
8fc0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
8fd0: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
8fe0: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
8ff0: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
9000: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
9010: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
9020: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
9030: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
9040: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
9070: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
9080: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9090: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
90a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
90b0: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
90c0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
90d0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
90e0: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
90f0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
9100: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
9110: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
9120: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9140: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
9150: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
9160: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
9170: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
9180: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
9190: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
91a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
91b0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
91c0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
91e0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
91f0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
9200: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
9210: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
9220: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
9230: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
9240: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
9250: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
9260: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
9270: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
9280: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9290: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
92a0: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
92b0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
92c0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
92d0: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
92e0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
92f0: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
9300: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
9310: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
9320: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
9330: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
9340: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9350: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
9380: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
9390: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
93a0: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
93b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
93c0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
93d0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
93e0: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
93f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9400: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
9410: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
9420: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
9430: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9440: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
9450: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
9460: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
9470: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
9480: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
9490: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
94a0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
94b0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
94c0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
94d0: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
94e0: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
94f0: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
9500: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
9510: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
9520: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
9530: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
9540: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
9550: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
9560: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
9570: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
9580: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
9590: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
95a0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
95b0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
95c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
95d0: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
95e0: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
95f0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
9600: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
9610: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
9620: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
9630: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
9640: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
9650: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
9660: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
9670: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
9680: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
9690: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
96a0: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
96b0: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
96c0: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
96d0: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
96e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
96f0: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
9700: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9710: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
9720: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
9750: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
9760: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
9770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9780: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
9790: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
97a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
97b0: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
97c0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
97d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
97e0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
97f0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
9800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9810: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
9820: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
9830: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
9840: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9860: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
9870: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
9880: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
9890: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98b0: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
98c0: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
98d0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
98e0: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
98f0: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
9900: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
9910: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
9920: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
9930: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
9940: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
9950: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
9960: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
9970: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
9980: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
9990: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
99a0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
99b0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
99c0: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
99d0: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
99e0: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
99f0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
9a00: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
9a10: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
9a20: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
9a30: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
9a40: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
9a50: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
9a60: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
9a70: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
9a80: 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  s the GNU versio
9a90: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
9aa0: 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75  ) that.  ** retu
9ab0: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
9ac0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
9ad0: 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  ning the error m
9ae0: 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69  essage. That poi
9af0: 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70  nter .  ** may p
9b00: 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20  oint to aErr[], 
9b10: 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20  or it may point 
9b20: 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73  to some static s
9b30: 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65  torage somewhere
9b40: 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
9b50: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
9b60: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
9b70: 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  es the POSIX ver
9b80: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74  sion of .  ** st
9b90: 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63  rerror_r(), whic
9ba0: 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20  h always writes 
9bb0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9bc0: 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20   into aErr[]..  
9bd0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  **.  ** If the c
9be0: 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  ode incorrectly 
9bf0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
9c00: 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  is the POSIX ver
9c10: 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a  sion that is.  *
9c20: 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  * available, the
9c30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9c40: 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20  ill often be an 
9c50: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f  empty string. No
9c60: 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72  t a.  ** huge pr
9c70: 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74  oblem. Incorrect
9c80: 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68  ly concluding th
9c90: 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  at the GNU versi
9ca0: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  on is available 
9cb0: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  .  ** could lead
9cc0: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74   to a segfault t
9cd0: 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20  hough..  */.#if 
9ce0: 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52  defined(STRERROR
9cf0: 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65  _R_CHAR_P) || de
9d00: 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29  fined(__USE_GNU)
9d10: 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64  .  zErr = .# end
9d20: 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28  if.  strerror_r(
9d30: 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69  iErrno, aErr, si
9d40: 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a  zeof(aErr)-1);..
9d50: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52  #elif SQLITE_THR
9d60: 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69  EADSAFE.  /* Thi
9d70: 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66  s is a threadsaf
9d80: 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72  e build, but str
9d90: 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74  error_r() is not
9da0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20   available. */. 
9db0: 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73   zErr = "";.#els
9dc0: 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61  e.  /* Non-threa
9dd0: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65  dsafe build, use
9de0: 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a   strerror(). */.
9df0: 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f    zErr = strerro
9e00: 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69  r(iErrno);.#endi
9e10: 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  f..  if( zPath==
9e20: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
9e30: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
9e40: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
9e50: 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29  _unix.c:%d: (%d)
9e60: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
9e70: 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72       iLine, iErr
9e80: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
9e90: 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72  , zErr.  );..  r
9ea0: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
9eb0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
9ec0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9ed0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
9ee0: 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c   that close() al
9ef0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b  most always work
9f00: 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f  s, since it is o
9f10: 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79  nly in a.** very
9f20: 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f   sick applicatio
9f30: 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73  n or on a very s
9f40: 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61  ick platform tha
9f50: 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e  t it might fail.
9f60: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66  .** If it does f
9f70: 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b  ail, simply leak
9f80: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
9f90: 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67  ptor, but do log
9fa0: 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a   the.** error..*
9fb0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
9fc0: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
9fd0: 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61   retry close() a
9fe0: 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65  fter EINTR since
9ff0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
a000: 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61  criptor might ha
a010: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
a020: 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65  reused by anothe
a030: 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20  r thread..** So 
a040: 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72  we don't even tr
a050: 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  y to recover fro
a060: 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73  m an EINTR.  Jus
a070: 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a  t log the error.
a080: 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a  ** and move on..
a090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a0a0: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78  obust_close(unix
a0b0: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
a0c0: 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b   h, int lineno){
a0d0: 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68  .  if( osClose(h
a0e0: 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  ) ){.    unixLog
a0f0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49  ErrorAtLine(SQLI
a100: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
a110: 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20  "close",.       
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a  pFile ? pFile->z
a140: 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f  Path : 0, lineno
a150: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a160: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
a170: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
a180: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
a190: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
a1a0: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
a1b0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
a1c0: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
a1d0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a1e0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a1f0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a200: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
a210: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
a220: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
a230: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
a240: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
a250: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
a260: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72   p->pNext;.    r
a270: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
a280: 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45  e, p->fd, __LINE
a290: 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  __);.    sqlite3
a2a0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
a2b0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
a2c0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
a2d0: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
a2e0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
a2f0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
a300: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
a310: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
a320: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
a330: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
a340: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
a350: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
a360: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
a370: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a380: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a390: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
a3a0: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
a3b0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
a3c0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a3d0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a3e0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
a3f0: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
a400: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
a410: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
a420: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
a430: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
a440: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a450: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
a460: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
a470: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
a480: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
a490: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
a4a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a4b0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
a4c0: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
a4d0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a4e0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
a4f0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a500: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a510: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
a520: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
a530: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
a540: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a550: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a560: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
a570: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
a580: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
a590: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
a5a0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
a5b0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
a5c0: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
a5d0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
a5e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a5f0: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
a600: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
a610: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
a620: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
a630: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a640: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
a650: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
a660: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
a670: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
a680: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
a690: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
a6a0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
a6b0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
a6c0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
a6d0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
a6e0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
a6f0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
a700: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
a710: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
a720: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a730: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
a740: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
a750: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
a760: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
a770: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
a780: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
a790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
a7a0: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
a7b0: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
a7c0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
a7d0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
a7e0: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
a7f0: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
a800: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
a810: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a820: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
a840: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
a850: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
a860: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a880: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a890: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
a8a0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
a8b0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
a8c0: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
a8d0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a8e0: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
a8f0: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
a900: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
a910: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
a920: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
a930: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a940: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
a950: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
a960: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
a970: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
a980: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
a990: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
a9a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
a9b0: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
a9c0: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
a9d0: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
a9e0: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
a9f0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
aa00: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
aa10: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
aa20: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
aa30: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
aa40: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
aa50: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
aa60: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
aa70: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
aa80: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
aa90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
aaa0: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
aab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
aac0: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
aad0: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
aae0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
aaf0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
ab00: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
ab10: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
ab20: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
ab30: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
ab40: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
ab50: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
ab60: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
ab70: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
ab80: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
ab90: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
aba0: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
abb0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
abc0: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
abd0: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
abe0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
abf0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
ac00: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
ac10: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
ac20: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
ac30: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
ac40: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
ac50: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
ac60: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
ac70: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
ac80: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
ac90: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
aca0: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
acb0: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
acc0: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
acd0: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
ace0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
acf0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
ad00: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
ad10: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
ad20: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
ad30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
ad40: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
ad50: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
ad60: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
ad70: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
ad80: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
ad90: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
ada0: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
adb0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
adc0: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
add0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =1 ){.      pFil
ade0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
adf0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
ae00: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
ae10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ae20: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
ae30: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
ae40: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  c!=0 ){.      pF
ae50: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
ae60: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
ae70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ae80: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
ae90: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
aea0: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
aeb0: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
aec0: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
aed0: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
aee0: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
aef0: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
af00: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
af10: 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  Id.ino = statbuf
af20: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
af30: 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
af40: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
af50: 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28  Inode && memcmp(
af60: 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65  &fileId, &pInode
af70: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
af80: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
af90: 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
afa0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
afb0: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
afc0: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c      pInode = sql
afd0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
afe0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a  eof(*pInode) );.
aff0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d      if( pInode==
b000: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
b010: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b020: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
b030: 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  (pInode, 0, size
b040: 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20  of(*pInode));.  
b050: 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65    memcpy(&pInode
b060: 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49  ->fileId, &fileI
b070: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
b080: 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ));.    pInode->
b090: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  nRef = 1;.    pI
b0a0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e  node->pNext = in
b0b0: 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e  odeList;.    pIn
b0c0: 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ode->pPrev = 0;.
b0d0: 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73      if( inodeLis
b0e0: 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70  t ) inodeList->p
b0f0: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  Prev = pInode;. 
b100: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
b110: 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Inode;.  }else{.
b120: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
b130: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f  ++;.  }.  *ppIno
b140: 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72  de = pInode;.  r
b150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b160: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
b170: 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74   a unixFile that
b180: 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20   is a database. 
b190: 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c   Verify the foll
b1a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  owing:.**.** (1)
b1b0: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
b1c0: 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20  y one hard link 
b1d0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28  on the file.** (
b1e0: 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  2) The file is n
b1f0: 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
b200: 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69  nk.** (3) The fi
b210: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
b220: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b230: 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20  ked.**.** Issue 
b240: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b250: 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20  TE_WARNING,...) 
b260: 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74  messages if anyt
b270: 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68  hing is not righ
b280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b290: 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75  d verifyDbFile(u
b2a0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b2b0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b2c0: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  uf;.  int rc;.  
b2d0: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
b2e0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b2f0: 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f 2a  WARNED ){.    /*
b300: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
b310: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  the following wa
b320: 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72 65  rnings have alre
b330: 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64 2e  ady been issued.
b340: 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20    Do not.    ** 
b350: 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20 61  repeat them so a
b360: 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65 72  s not to clutter
b370: 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20 2a   the error log *
b380: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
b390: 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  }.  rc = osFstat
b3a0: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
b3b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
b3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b3d0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b3e0: 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64   "cannot fstat d
b3f0: 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c  b file %s", pFil
b400: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b410: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b420: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b430: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b440: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b450: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b460: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b470: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b480: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b490: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b4a0: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b4b0: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b4c0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b4d0: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
b4e0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
b4f0: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
b500: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b510: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
b520: 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nk>1 ){.    sqli
b530: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b540: 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c  ARNING, "multipl
b550: 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a  e links to file:
b560: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b570: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b580: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b590: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b5a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b5b0: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
b5c0: 65 21 3d 30 0a 20 20 20 26 26 20 28 28 72 63 20  e!=0.   && ((rc 
b5d0: 3d 20 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e  = osStat(pFile->
b5e0: 7a 50 61 74 68 2c 20 26 62 75 66 29 29 21 3d 30  zPath, &buf))!=0
b5f0: 0a 20 20 20 20 20 20 20 7c 7c 20 62 75 66 2e 73  .       || buf.s
b600: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
b610: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
b620: 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
b630: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b640: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
b650: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
b660: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b670: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b680: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b690: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b6a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
b6b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b6c0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
b6d0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
b6e0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
b6f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
b700: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
b710: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
b720: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
b730: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
b740: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
b750: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
b760: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
b770: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
b780: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
b790: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
b7a0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
b7b0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
b7c0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
b7d0: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
b7e0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
b7f0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
b800: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
b810: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
b820: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b830: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
b840: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
b850: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b860: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
b870: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b880: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
b890: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b8a0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
b8b0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
b8c0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
b8d0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
b8e0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
b8f0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
b900: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
b910: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
b920: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
b930: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
b940: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
b950: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
b960: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
b970: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
b980: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
b990: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
b9a0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
b9b0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
b9c0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
b9d0: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
b9e0: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
b9f0: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
ba00: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
ba10: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
ba20: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
ba30: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
ba40: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ba50: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
ba60: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ba70: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
ba80: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
ba90: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
baa0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
bab0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
bac0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bad0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
bae0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  DLOCK;.      pFi
baf0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
bb00: 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  errno;.    } els
bb10: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
bb20: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
bb30: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
bb40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bb50: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
bb60: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
bb70: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
bb80: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
bb90: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
bba0: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
bbb0: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
bbc0: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
bbd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
bbe0: 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20  ttempt to set a 
bbf0: 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74  system-lock on t
bc00: 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20  he file pFile.  
bc10: 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  The lock is .** 
bc20: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f  described by pLo
bc30: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
bc40: 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65   pFile was opene
bc50: 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f  d read/write fro
bc60: 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65  m unix-excl, the
bc70: 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a  n the only lock.
bc80: 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64  ** ever obtained
bc90: 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65   is an exclusive
bca0: 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73   lock, and it is
bcb0: 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c   obtained exactl
bcc0: 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69  y once.** the fi
bcd0: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
bce0: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
bcf0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
bd00: 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a  system locking.*
bd10: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63  * operations bec
bd20: 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63  ome no-ops.  Loc
bd30: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  king operations 
bd40: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74  still happen int
bd50: 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f  ernally,.** in o
bd60: 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61  rder to coordina
bd70: 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65  te access betwee
bd80: 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  n separate datab
bd90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
bda0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70  ** within this p
bdb0: 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20  rocess, but all 
bdc0: 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c  of that is handl
bdd0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
bde0: 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e   the.** operatin
bdf0: 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  g system does no
be00: 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a  t participate..*
be10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
be20: 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72  on is a pass-thr
be30: 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f  ough to fcntl(F_
be40: 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20  SETLK) if pFile 
be50: 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20  is using.** any 
be60: 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22  VFS other than "
be70: 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66  unix-excl" or if
be80: 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64   pFile is opened
be90: 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a   on "unix-excl".
bea0: 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
beb0: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  nly..**.** Zero 
bec0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
bed0: 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65  he call complete
bee0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
bef0: 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a  or -1 if a call.
bf00: 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61  ** to fcntl() fa
bf10: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
bf20: 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20  e, errno is set 
bf30: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62  appropriately (b
bf40: 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73  y fcntl())..*/.s
bf50: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
bf60: 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  leLock(unixFile 
bf70: 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66  *pFile, struct f
bf80: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
bf90: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e  int rc;.  unixIn
bfa0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
bfb0: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
bfc0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
bfd0: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
bfe0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
bff0: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69  0 );.  if( ((pFi
c000: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
c010: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d  UNIXFILE_EXCL)!=
c020: 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72  0 || pInode->bPr
c030: 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26  ocessLock).   &&
c040: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
c050: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
c060: 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a  DONLY)==0).  ){.
c070: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
c080: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
c090: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
c0a0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
c0b0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c0c0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ->nLock==0 );.  
c0d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c0e0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c0f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c100: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
c110: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
c120: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
c130: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
c140: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
c150: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
c160: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c170: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
c180: 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74    if( rc<0 ) ret
c190: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49  urn rc;.      pI
c1a0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
c1b0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ck = 1;.      pI
c1c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c1d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c1e0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
c1f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
c200: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
c210: 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b  , F_SETLK, pLock
c220: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c230: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
c240: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
c250: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
c260: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
c270: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
c280: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
c290: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
c2a0: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
c2b0: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
c2c0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
c2d0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
c2e0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
c2f0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
c300: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
c310: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
c320: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
c330: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
c340: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
c350: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
c360: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
c370: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
c380: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
c390: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
c3a0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
c3b0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
c3c0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
c3d0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
c3e0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
c3f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
c400: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
c410: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
c420: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
c430: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
c440: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
c450: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
c460: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
c470: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
c480: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
c490: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
c4a0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
c4b0: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
c4c0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
c4d0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
c4e0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
c4f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c500: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
c510: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
c520: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c530: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
c540: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
c550: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
c560: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
c570: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c580: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
c590: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
c5a0: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
c5b0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c5c0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
c5d0: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
c5e0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
c5f0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
c600: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
c610: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
c620: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
c630: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
c640: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
c650: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
c660: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
c670: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
c680: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
c690: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
c6a0: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
c6b0: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
c6c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
c6d0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
c6e0: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
c6f0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
c700: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
c710: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
c720: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
c730: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
c740: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
c750: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
c760: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
c770: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c780: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
c790: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
c7a0: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
c7b0: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
c7c0: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
c7d0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
c7e0: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
c7f0: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
c800: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
c810: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
c820: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
c830: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
c840: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
c850: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
c860: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
c870: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
c880: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
c890: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
c8a0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
c8b0: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
c8c0: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
c8d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
c8e0: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
c8f0: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
c900: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
c910: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
c920: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
c930: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
c940: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
c950: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
c960: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
c970: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
c980: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
c990: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
c9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
c9b0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
c9c0: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
c9d0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
c9e0: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
c9f0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
ca00: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
ca10: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
ca20: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
ca30: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
ca40: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
ca50: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
ca60: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
ca70: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
ca80: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
ca90: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
caa0: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
cab0: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
cac0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
cad0: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
cae0: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
caf0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
cb00: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
cb10: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
cb20: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
cb30: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
cb40: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
cb50: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
cb60: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
cb70: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
cb80: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
cb90: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
cba0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
cbb0: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
cbc0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
cbd0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
cbe0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
cbf0: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
cc00: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
cc10: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
cc20: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
cc30: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
cc40: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
cc50: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
cc60: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
cc70: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
cc80: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
cc90: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cca0: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
ccb0: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
ccc0: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
ccd0: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
cce0: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
ccf0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
cd00: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
cd10: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
cd20: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
cd30: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
cd40: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
cd50: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
cd60: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
cd70: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
cd80: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
cd90: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
cda0: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
cdb0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
cdc0: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
cdd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cde0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
cdf0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
ce00: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
ce10: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
ce20: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ce30: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
ce40: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
ce50: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
ce60: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
ce70: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
ce80: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
ce90: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
cea0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
ceb0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
cec0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
ced0: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
cee0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
cef0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
cf00: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
cf10: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
cf20: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
cf30: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cf40: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
cf50: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
cf60: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
cf70: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
cf80: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cf90: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
cfa0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cfb0: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cfc0: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cfd0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cfe0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cff0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
d000: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
d010: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
d020: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
d030: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
d040: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
d050: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
d060: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
d070: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
d080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
d090: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d0a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
d0b0: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
d0c0: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
d0d0: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
d0e0: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
d0f0: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
d100: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
d110: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
d120: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
d130: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
d140: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
d150: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
d160: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
d170: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
d180: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
d190: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
d1a0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
d1b0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
d1c0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d1d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d1e0: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
d1f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d200: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
d210: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
d220: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d230: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d240: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
d250: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d260: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d270: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d280: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d290: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d2a0: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d2b0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d2c0: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d2d0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d2e0: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d2f0: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d300: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d310: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d320: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d330: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d340: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d350: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d360: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d370: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d380: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d390: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d3a0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d3b0: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d3c0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d3d0: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d3e0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d3f0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d400: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d410: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d420: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d430: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d440: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d450: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d460: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d470: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d480: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d490: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d4a0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d4b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d4c0: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d4d0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d4e0: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d4f0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d500: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d510: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d520: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d530: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d540: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d550: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d560: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d570: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d580: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d590: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d5a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d5b0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d5c0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d5d0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d5e0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d5f0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d600: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d610: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d620: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d630: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d640: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d650: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d660: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d670: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d680: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d690: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d6a0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d6b0: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d6c0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d6d0: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d6e0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d6f0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d700: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d710: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d720: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d730: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d740: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d750: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d760: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d770: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d780: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d790: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d7a0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d7b0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d7c0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d7d0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d7e0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d7f0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d800: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d810: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
d820: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d830: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d840: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d850: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d860: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d870: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d880: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d890: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d8a0: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d8b0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d8c0: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d8d0: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d8e0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d8f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d900: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d910: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d930: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d940: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d950: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d960: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d970: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d980: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d990: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d9a0: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d9b0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d9c0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d9d0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d9e0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d9f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
da00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
da10: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
da20: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
da30: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
da40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
da50: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
da60: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
da70: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
da80: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
da90: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
daa0: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
dab0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
dac0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
dad0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
dae0: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
daf0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
db00: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
db10: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
db20: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
db30: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
db40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
db50: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
db60: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
db70: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
db80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
db90: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
dba0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dbb0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
dbc0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
dbd0: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
dbe0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
dbf0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
dc00: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
dc10: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
dc20: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
dc30: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
dc40: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
dc50: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
dc60: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
dc70: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
dc80: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
dc90: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
dca0: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
dcb0: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
dcc0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
dcd0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
dce0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
dcf0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
dd00: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
dd10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
dd20: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
dd30: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
dd40: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
dd50: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
dd60: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
dd70: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
dd80: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
dd90: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
dda0: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
ddb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
ddc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ddd0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
dde0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
ddf0: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
de00: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
de10: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
de20: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
de30: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
de40: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
de50: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
de60: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
de70: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
de80: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
de90: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
dea0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
deb0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
dec0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
ded0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
dee0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
def0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
df00: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
df10: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
df20: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
df30: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
df40: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
df50: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
df60: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
df70: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
df90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
dfa0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
dfb0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
dfc0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
dfd0: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
dfe0: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
dff0: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
e000: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
e010: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
e020: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
e030: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
e040: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
e050: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
e060: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
e070: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
e080: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
e090: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
e0a0: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
e0b0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
e0c0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
e0d0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
e0e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
e0f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
e100: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
e110: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
e120: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
e130: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
e140: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
e150: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
e160: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
e170: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
e180: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
e190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
e1a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e1b0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
e1c0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e1d0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e1e0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
e1f0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e200: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
e210: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
e220: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
e230: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e240: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e250: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
e260: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
e270: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
e280: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
e290: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
e2a0: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
e2b0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
e2c0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
e2d0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
e2e0: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
e2f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e300: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
e310: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
e320: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
e330: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
e340: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
e350: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
e360: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
e370: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
e380: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
e390: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
e3a0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
e3b0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
e3c0: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
e3d0: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
e3e0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
e3f0: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
e400: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
e410: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
e420: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
e430: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e440: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e450: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e460: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
e470: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
e480: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e490: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e4a0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e4b0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e4c0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e4d0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e4e0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e4f0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e500: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e510: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e520: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
e530: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
e540: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
e550: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
e560: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
e570: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
e580: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
e590: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
e5a0: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
e5b0: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
e5c0: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
e5d0: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
e5e0: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
e5f0: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
e600: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
e610: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
e620: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
e630: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
e640: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
e650: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
e660: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
e670: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
e680: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
e690: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
e6a0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
e6b0: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
e6c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e6d0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
e6e0: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
e6f0: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
e700: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e710: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e720: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e730: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e740: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
e750: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
e760: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e770: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
e780: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
e790: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
e7a0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e7b0: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
e7c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
e7d0: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e7e0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
e7f0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
e800: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
e810: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
e820: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
e830: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e840: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
e850: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
e860: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
e870: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e880: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
e890: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
e8a0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
e8b0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
e8c0: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
e8d0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
e8e0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
e8f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e900: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e910: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
e920: 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
e930: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
e940: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
e950: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
e960: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
e970: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
e980: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
e990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
e9a0: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
e9b0: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
e9c0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
e9d0: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
e9e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
e9f0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
ea00: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
ea10: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ea20: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
ea30: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
ea40: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
ea50: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
ea60: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
ea70: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
ea80: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
ea90: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
eaa0: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
eab0: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
eac0: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
ead0: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
eae0: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
eaf0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
eb00: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
eb10: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
eb20: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
eb30: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
eb40: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
eb50: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
eb60: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
eb70: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
eb80: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
eb90: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
eba0: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
ebb0: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
ebc0: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
ebd0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
ebe0: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
ebf0: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
ec00: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
ec10: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
ec20: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
ec30: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
ec40: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
ec50: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
ec60: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
ec70: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
ec80: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
ec90: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
eca0: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
ecb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
ecc0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ecd0: 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65  LOCK ){..#if !de
ece0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
ecf0: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42   || !SQLITE_ENAB
ed00: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
ed10: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e  .      (void)han
ed20: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20  dleNFSUnlock;.  
ed30: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64      assert( hand
ed40: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29  leNFSUnlock==0 )
ed50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
ed60: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
ed70: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
ed80: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
ed90: 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e       if( handleN
eda0: 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  FSUnlock ){.    
edb0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20      int tErrno; 
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
edd0: 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
ede0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72   system call err
edf0: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ors */.        o
ee00: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
ee10: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
ee20: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
ee30: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ee40: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
ee50: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ee60: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ee70: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ee80: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ee90: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
eea0: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
eeb0: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
eec0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
eed0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
eee0: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
eef0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ef00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ef10: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
ef20: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ef30: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ef40: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ef50: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ef60: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ef70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ef80: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ef90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
efa0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
efb0: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
efc0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
efd0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
efe0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
eff0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
f000: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f010: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f020: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f030: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f040: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f050: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f060: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f070: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f080: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f090: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f0a0: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
f0b0: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f0c0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f0d0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
f0e0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f0f0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
f100: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f110: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
f130: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f140: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f150: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f160: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f170: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f180: 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69  ARED_FIRST+divSi
f190: 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ze;.        lock
f1a0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f1b0: 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20  SIZE-divSize;.  
f1c0: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
f1d0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f1e0: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
f1f0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
f200: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f210: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f220: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
f230: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f240: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
f250: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
f260: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
f270: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f280: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
f290: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f2a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f2b0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
f2c0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f2d0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f2e0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
f2f0: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
f300: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f310: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f320: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f330: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f340: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f350: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f360: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f370: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f390: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f3a0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
f3b0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
f3c0: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
f3d0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
f3e0: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
f3f0: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
f400: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
f410: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
f420: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
f430: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
f440: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f450: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
f460: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
f470: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
f480: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
f490: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
f4a0: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
f4b0: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
f4c0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f4d0: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
f4e0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f4f0: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
f500: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
f510: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
f520: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
f530: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
f540: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
f550: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f560: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f570: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  CK;.          pF
f580: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f590: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f5a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
f5b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f5c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
f5d0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f5e0: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
f5f0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f600: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
f610: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
f620: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
f630: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
f640: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
f650: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
f660: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
f670: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f680: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
f690: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
f6a0: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
f6b0: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
f6c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f6d0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f6e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f6f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f700: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f710: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f720: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f730: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f740: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f750: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f760: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f770: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f780: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f790: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f7a0: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f7b0: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f7c0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f7d0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f7e0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f7f0: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f800: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f810: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f820: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f830: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f840: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f850: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f860: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f870: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f880: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f890: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f8b0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f8c0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f8d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f8e0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f8f0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f900: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f910: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f920: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f930: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f940: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f950: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f960: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f970: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f980: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f990: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f9a0: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f9b0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f9c0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f9d0: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f9e0: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f9f0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
fa00: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
fa10: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
fa20: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
fa30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
fa40: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
fa50: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
fa60: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
fa70: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
fa80: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
fa90: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
faa0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
fab0: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
fac0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
fad0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fae0: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
faf0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
fb00: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
fb10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
fb20: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
fb30: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
fb40: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
fb50: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
fb60: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
fb70: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
fb80: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
fb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
fba0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
fbb0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fbc0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
fbd0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
fbe0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
fbf0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
fc00: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
fc10: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
fc20: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
fc30: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fc40: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
fc50: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
fc60: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
fc70: 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
fc80: 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
fc90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73   );.  return pos
fca0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
fcb0: 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 73  leLock, 0);.}..s
fcc0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
fcd0: 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
fce0: 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
fcf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
fd00: 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
fd10: 69 6c 65 20 2a 70 46 64 29 3b 0a 0a 2f 2a 0a 2a  ile *pFd);../*.*
fd20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
fd30: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
fd40: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
fd50: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
fd60: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
fd70: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
fd80: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
fd90: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
fda0: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
fdb0: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
fdc0: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
fdd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
fde0: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
fdf0: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
fe00: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
fe10: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
fe20: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
fe30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
fe40: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
fe50: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
fe60: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
fe70: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
fe80: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
fe90: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
fea0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
feb0: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
fec0: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
fed0: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
fee0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fef0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
ff00: 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
ff10: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ff20: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
ff30: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
ff40: 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
ff50: 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
ff60: 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
ff70: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
ff80: 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
ff90: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74     if( pFile->ct
ffa0: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
ffb0: 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
ffc0: 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
ffd0: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
ffe0: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
fff0: 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
10000 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
10010 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
10020 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
10030 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
10040 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
10050 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
10060 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
10070 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10080 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
10090 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
100a0 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
100b0 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
100c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
100d0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
100e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
100f0 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
10100 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
10110 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10120 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
10130 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
10140 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
10150 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
10160 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
10170 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
10180 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
10190 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
101a0 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
101b0 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
101c0 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
101d0 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
101e0 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
101f0 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
10200 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
10210 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10220 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
10230 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
10240 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
10250 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
10260 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
10270 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
10280 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
10290 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
102a0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
102b0 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
102c0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
102d0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
102e0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
102f0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
10300 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
10310 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
10320 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
10330 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
10340 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
10350 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
10360 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
10370 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
10380 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
10390 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
103a0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
103b0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
103c0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
103d0 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
103e0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
103f0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
10400 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
10410 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
10420 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10430 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
10440 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10450 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10460 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104b0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10500 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10520 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
10530 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10550 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
10560 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10570 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10580 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10590 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
105a0 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
105b0 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
105c0 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
105d0 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
105e0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
105f0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
10600 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
10610 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
10620 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
10630 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
10640 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
10650 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
10660 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10670 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10680 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10690 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
106a0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
106b0 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
106c0 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
106d0 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
106e0 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
106f0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10700 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
10710 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
10720 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10730 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
10740 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
10750 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
10760 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10770 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10780 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10790 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
107a0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
107b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
107c0 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
107d0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
107e0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
107f0 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10800 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
10810 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
10820 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
10830 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10840 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10850 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10860 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10870 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10880 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10890 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
108a0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
108b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
108c0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
108d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
108e0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
108f0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10900 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
10910 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
10920 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10930 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10940 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
10950 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10960 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10970 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10980 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10990 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
109a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
109b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
109c0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
109d0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
109e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
109f0 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10a00 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
10a10 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10a30 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
10a40 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10a50 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10a60 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ab0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
10b30 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b50 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
10b60 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10b70 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10b80 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
10b90 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
10ba0 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
10bb0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
10bc0 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
10bd0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
10be0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10bf0 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10c00 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10c10 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
10c20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
10c30 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
10c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
10c50 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
10c60 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
10c70 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
10c80 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
10c90 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
10ca0 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
10cb0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
10cc0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
10cd0 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
10ce0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
10cf0 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
10d00 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
10d10 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
10d20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
10d30 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
10d40 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
10d50 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
10d60 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
10d70 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
10d80 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
10d90 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
10da0 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
10db0 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
10dc0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
10dd0 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
10de0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
10df0 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
10e00 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
10e10 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
10e20 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
10e30 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
10e40 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
10e50 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
10e60 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
10e70 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
10e80 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
10e90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
10ea0 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
10eb0 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
10ec0 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
10ed0 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
10ee0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
10ef0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
10f00 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
10f10 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
10f20 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
10f30 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
10f40 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
10f50 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
10f60 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
10f70 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
10f80 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10f90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
10fa0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
10fb0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
10fc0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
10fd0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
10fe0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
10ff0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
11000 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
11010 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11020 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11030 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11040 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11050 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11060 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11070 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11080 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11090 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
110a0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
110b0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
110c0 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
110d0 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
110e0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
110f0 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
11100 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
11110 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
11120 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
11130 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
11140 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
11150 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
11160 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11180 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11190 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
111a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
111b0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
111c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
111d0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
111e0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
111f0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11200 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
11210 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
11220 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
11230 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
11240 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
11250 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
11260 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11270 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11280 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11290 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
112a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
112b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
112c0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
112d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
112e0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
112f0 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
11300 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
11310 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
11320 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
11330 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
11340 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
11350 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
11360 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11370 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11380 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11390 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
113a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
113b0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
113c0 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
113d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
113e0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
113f0 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
11400 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
11410 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11420 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11430 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
11440 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
11450 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
11460 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11470 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11480 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11490 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
114a0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
114b0 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
114c0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
114d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
114e0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
114f0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11500 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
11510 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11520 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11530 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11540 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11550 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11560 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11570 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11580 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11590 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
115a0 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
115b0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
115c0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
115d0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
115e0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
115f0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11600 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
11610 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11620 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11630 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11640 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11650 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11660 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11670 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11680 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11690 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
116a0 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
116b0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
116c0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
116d0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
116e0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
116f0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11700 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
11710 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11720 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11730 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11740 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11750 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11760 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11770 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11780 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11790 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
117a0 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
117b0 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
117c0 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
117d0 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
117e0 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
117f0 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11800 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
11810 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
11820 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11830 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11840 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11850 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11860 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11870 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11880 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11890 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
118a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
118b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
118c0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
118d0 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
118e0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
118f0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11900 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
11910 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
11920 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
11930 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
11940 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
11950 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11960 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11970 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11980 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11990 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
119a0 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
119b0 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
119c0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
119d0 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
119e0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
119f0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11a00 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
11a10 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11a20 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11a40 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
11a50 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11a60 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11a70 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11a80 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11a90 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11aa0 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11ab0 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11ac0 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11ad0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11ae0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11af0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11b00 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11b10 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11b20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11b30 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11b40 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11b50 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
11b60 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11b70 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11b80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11b90 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11bb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11bc0 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
11bd0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
11be0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11bf0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
11c00 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
11c10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11c20 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
11c30 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11c40 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11c50 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
11c60 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11c70 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11c80 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11c90 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11ca0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11cb0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11cc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
11cd0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
11ce0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
11cf0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
11d00 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
11d10 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
11d20 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
11d30 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
11d40 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
11d50 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
11d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d70 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
11d80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11d90 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
11da0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11db0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11dc0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
11dd0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
11de0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11df0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
11e00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11e10 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
11e20 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
11e30 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
11e40 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
11e50 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
11e60 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
11e70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
11e80 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
11e90 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
11ea0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
11eb0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
11ec0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
11ed0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11ee0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
11ef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11f00 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
11f10 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
11f20 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
11f30 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11f40 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
11f50 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
11f60 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
11f70 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
11f80 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
11f90 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
11fa0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
11fb0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11fc0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
11fd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11fe0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11ff0 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
12000 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
12010 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12020 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
12030 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
12040 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
12050 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
12060 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
12070 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49  && errno==ENOTDI
12080 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e  R ) rc = osUnlin
12090 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  k(zLockFile);.  
120a0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
120b0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
120c0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  no;.    rc = 0;.
120d0 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
120e0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
120f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
12100 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
12110 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
12120 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12130 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12140 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12150 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12160 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
12170 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12180 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
12190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
121a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
121b0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
121c0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
121d0 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
121e0 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
121f0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
12200 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
12210 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
12220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12230 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
12240 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12250 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12260 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
12270 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
12280 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12290 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
122a0 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
122b0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
122c0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
122d0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
122e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
122f0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
12300 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
12310 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12320 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12370 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123e0 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
123f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12420 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12430 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12440 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12450 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12460 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12470 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12480 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12490 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
124a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
124b0 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
124c0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
124d0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
124e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
124f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12500 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
12510 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12520 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12530 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12540 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12550 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12560 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12570 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12580 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12590 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
125a0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
125b0 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
125c0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
125d0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
125e0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
125f0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
12600 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12610 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12620 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
12630 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
12640 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12650 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12660 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12670 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
12680 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
12690 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
126a0 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
126b0 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
126c0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
126d0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
126e0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
126f0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
12700 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
12710 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
12720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12730 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
12740 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
12750 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
12760 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
12770 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12780 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
12790 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
127a0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
127b0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
127c0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
127d0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
127e0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
127f0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12800 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12810 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12820 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12830 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12840 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12850 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12860 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
12870 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12880 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
12890 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
128a0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
128b0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
128c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
128d0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
128e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
128f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12900 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12910 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12920 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12930 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12940 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12950 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12960 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12970 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
12980 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
12990 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
129a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
129b0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
129c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
129d0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
129e0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
129f0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
12a00 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
12a10 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12a20 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12a30 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12a40 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
12a50 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
12a60 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
12a70 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12a80 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
12a90 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
12aa0 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
12ab0 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
12ac0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
12ad0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
12ae0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12af0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
12b00 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
12b10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
12b20 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12b30 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
12b40 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
12b50 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
12b60 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
12b70 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
12b80 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12b90 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
12ba0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
12bb0 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12bc0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
12bd0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
12be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
12bf0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
12c00 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12c10 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12c20 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
12c30 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
12c40 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
12c50 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12c60 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12c70 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12c80 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
12c90 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
12ca0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12cb0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
12cc0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12cd0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
12ce0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
12cf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12d00 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
12d10 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
12d20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
12d30 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12d40 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
12d50 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12d60 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
12d70 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
12d80 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
12d90 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
12da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12db0 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
12dc0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
12dd0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12de0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
12df0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12e00 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12e10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12e20 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12e30 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12e40 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12e50 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12e60 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12e70 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12e80 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12e90 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12ea0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12eb0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12ec0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12ed0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12ee0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12ef0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12f00 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12f10 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12f20 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12f30 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12f40 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12f50 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12f60 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12f70 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12f80 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12f90 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12fa0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12fb0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12fc0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12fd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12fe0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12ff0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
13000 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
13010 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13020 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13030 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13040 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13050 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13060 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
13070 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13080 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
13090 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
130a0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
130b0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
130c0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
130d0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
130e0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
130f0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
13100 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
13110 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
13120 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
13130 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
13140 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
13150 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
13160 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
13170 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
13180 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
13190 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
131a0 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
131b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
131c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
131d0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
131e0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
131f0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
13200 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
13210 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13220 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
13230 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
13240 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13250 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13260 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13270 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13280 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13290 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
132a0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
132b0 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
132c0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
132d0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
132e0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
132f0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
13300 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
13310 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
13320 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13330 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13340 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13350 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13370 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
13380 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13390 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
133a0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
133b0 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
133c0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
133d0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
133e0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
133f0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
13400 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
13410 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13420 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13430 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
13440 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13450 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13460 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13470 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13480 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
13490 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
134a0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
134b0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
134c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
134d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
134e0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
134f0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
13500 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
13510 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
13520 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
13530 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
13540 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
13550 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
13560 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13570 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13580 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
13590 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
135a0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
135b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
135c0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
135d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
135e0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
135f0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
13600 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13610 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13620 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13630 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13640 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13650 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13660 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13670 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13680 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13690 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
136a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
136b0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
136c0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
136d0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
136e0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
136f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13700 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13710 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
13720 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13730 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13740 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13750 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13760 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
13770 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13780 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13790 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
137a0 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
137b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
137c0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
137d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
137e0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
137f0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
13800 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
13810 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13820 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13830 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13840 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13850 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13870 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13880 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13890 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
138a0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
138b0 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
138c0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
138d0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
138e0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
138f0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
13900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13910 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
13920 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
13930 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
13940 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13950 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
13960 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13970 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13980 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13990 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
139a0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
139b0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
139c0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
139d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
139e0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
139f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13a00 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
13a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13a20 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
13a30 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13a40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13a50 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13a60 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a80 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
13a90 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13aa0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72   NO_LOCK);.    r
13ab0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13ac0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
13ad0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
13ae0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13af0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
13b00 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
13b10 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13b20 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
13b30 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
13b40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b60 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bb0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
13bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c00 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
13c20 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
13c30 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
13c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c50 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
13c60 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
13c70 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
13c80 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
13c90 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
13ca0 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
13cb0 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
13cc0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
13cd0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
13ce0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
13cf0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
13d00 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
13d10 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
13d20 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
13d30 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
13d40 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
13d50 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
13d60 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
13d70 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
13d80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
13d90 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
13da0 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
13db0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13dc0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
13dd0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
13de0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
13df0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
13e00 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
13e10 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
13e20 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
13e30 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
13e40 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
13e50 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
13e60 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
13e70 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
13e80 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
13e90 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
13ea0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
13eb0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
13ec0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
13ed0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
13ee0 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
13ef0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13f00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13f10 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13f20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13f30 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13f40 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13f50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13f60 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13f70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13f80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13f90 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13fa0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13fb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13fc0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13fd0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13fe0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13ff0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
14000 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14010 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
14020 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14030 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14040 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14050 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14060 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
14070 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
14080 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
14090 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
140a0 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
140b0 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
140c0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
140d0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
140e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
140f0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
14100 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
14110 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
14120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14130 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14140 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14150 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14160 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
14170 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14180 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
14190 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
141a0 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
141b0 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
141c0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
141d0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
141e0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
141f0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14200 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
14210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14220 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
14230 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
14240 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
14250 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
14260 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
14270 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14280 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
14290 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
142a0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
142b0 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
142c0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
142d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
142e0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
142f0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
14300 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
14310 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
14320 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14330 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14340 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14350 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14360 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14370 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14380 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14390 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
143a0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
143b0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
143c0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
143d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
143e0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
143f0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
14400 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
14410 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14420 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14430 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14440 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14450 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14460 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14470 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14480 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14490 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
144a0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
144b0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
144c0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
144d0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
144e0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
144f0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
14500 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
14510 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14520 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14530 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14540 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14550 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14560 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14570 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14580 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14590 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
145a0 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
145b0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
145c0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
145d0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
145e0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
145f0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
14600 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
14610 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
14620 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
14630 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
14640 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
14650 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
14660 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
14670 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
14680 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
14690 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
146a0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
146b0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
146c0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
146d0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
146e0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
146f0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
14700 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
14710 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14720 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14730 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14740 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14750 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
14760 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14770 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14780 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14790 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
147a0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
147b0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
147c0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
147d0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
147e0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
147f0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
14800 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
14810 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14820 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14830 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14840 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14850 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
14860 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14870 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
14880 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
14890 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
148a0 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
148b0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
148c0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
148d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
148e0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
148f0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14900 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
14910 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
14920 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
14930 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14940 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
14950 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
14960 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14970 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14980 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
14990 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
149a0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
149b0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
149c0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
149d0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
149e0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
149f0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
14a00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
14a10 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
14a20 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14a30 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14a40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14a50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14a60 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14a70 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
14a80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14a90 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14aa0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14ab0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14ac0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
14ad0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
14ae0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
14af0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14b00 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
14b10 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
14b20 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
14b30 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
14b40 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
14b50 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
14b60 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14b70 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
14b80 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14b90 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14ba0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
14bb0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
14bc0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14bd0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
14be0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14c00 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14c10 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
14c20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
14c30 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
14c40 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
14c50 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
14c60 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14c70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14c80 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
14c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14ca0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
14cb0 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
14cc0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
14cd0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
14ce0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
14cf0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
14d00 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14d10 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14d20 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14d30 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
14d40 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14d50 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
14d60 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14d70 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
14d80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
14d90 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
14da0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
14db0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14dc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
14dd0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
14de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14df0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14e00 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
14e10 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
14e20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
14e40 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
14e50 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14e60 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14e70 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14e80 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
14e90 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
14ea0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14eb0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
14ec0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
14ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ee0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14ef0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
14f00 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
14f10 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
14f20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
14f30 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14f50 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
14f60 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
14f70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
14fe0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15050 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
15060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15080 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
15090 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
150a0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
150b0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
150c0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
150d0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
150e0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
150f0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
15100 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
15110 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15120 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
15130 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
15140 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
15150 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
15160 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
15170 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
15180 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
15190 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
151a0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
151b0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
151c0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
151d0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
151e0 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
151f0 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
15200 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
15210 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
15220 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
15230 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
15240 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
15250 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
15260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15270 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
15280 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
15290 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
152a0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
152b0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
152c0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
152d0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
152e0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
152f0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15300 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
15310 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
15320 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15330 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
15340 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
15350 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
15360 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
15370 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
15380 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
15390 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
153a0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
153b0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
153c0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
153d0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
153e0 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
153f0 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15400 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15430 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15440 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15450 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15460 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15470 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
15480 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
15490 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
154a0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
154b0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
154c0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
154d0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
154e0 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
154f0 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15500 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15510 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15520 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15530 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15540 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15550 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15560 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15570 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15580 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
15590 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
155a0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
155b0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
155c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
155d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
155e0 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
155f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15600 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15610 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15620 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15630 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15640 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15650 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15660 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15670 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
15680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15690 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
156a0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
156b0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
156c0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
156d0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
156e0 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
156f0 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15700 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15710 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15720 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15730 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15740 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15750 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15760 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15770 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15780 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
15790 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
157a0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
157b0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
157c0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
157d0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
157e0 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
157f0 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15800 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15810 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15820 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15830 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15840 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15850 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15860 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15870 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
15880 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
15890 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
158a0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
158b0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
158c0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
158d0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
158e0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
158f0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15900 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15910 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15920 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15930 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15940 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15950 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15960 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15970 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
15980 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
15990 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
159a0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
159b0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
159c0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
159d0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
159e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
159f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
15a00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15a10 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
15a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15a30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15a40 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15a50 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15a60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15a70 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15a80 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
15a90 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
15aa0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
15ab0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15ac0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15ad0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15ae0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
15af0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
15b00 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
15b10 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
15b20 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
15b30 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
15b40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15b50 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
15b60 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15b70 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
15b80 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
15b90 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
15ba0 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
15bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15bc0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15bd0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15be0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15bf0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
15c00 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
15c10 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
15c20 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
15c30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
15c40 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15c50 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
15c60 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
15c70 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15c80 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15c90 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15ca0 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
15cb0 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15cc0 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
15cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15ce0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
15cf0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
15d00 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15d10 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
15d20 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
15d30 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
15d40 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15d50 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15d60 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15d70 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
15d80 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
15d90 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15da0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
15db0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
15dc0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
15dd0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
15de0 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
15df0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15e00 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
15e10 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
15e20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
15e30 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15e40 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15e50 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15e60 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
15e70 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
15e80 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
15e90 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
15ea0 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
15eb0 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
15ec0 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
15ed0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
15ee0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
15ef0 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
15f00 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15f10 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15f20 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15f30 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
15f40 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15f50 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
15f60 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
15f70 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
15f80 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
15f90 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15fa0 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
15fb0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
15fc0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
15fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
15fe0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15ff0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
16000 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
16010 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16020 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
16030 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
16040 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
16050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16060 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
16070 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
16080 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
16090 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
160a0 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
160b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
160c0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
160d0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
160e0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
160f0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
16100 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
16110 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
16120 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
16130 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
16140 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
16150 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
16160 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
16170 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
16180 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
16190 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
161a0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
161b0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
161c0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
161d0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
161e0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
161f0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
16200 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
16210 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
16220 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
16230 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
16240 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
16250 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
16260 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
16270 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
16280 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
16290 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
162a0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
162b0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
162c0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
162d0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
162e0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
162f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
16300 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
16310 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
16320 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16330 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16340 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
16350 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
16360 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
16370 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
16380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16390 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
163a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
163b0 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
163c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
163d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
163e0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
163f0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
16400 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
16410 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
16420 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16430 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
16440 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16450 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16460 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
16470 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16480 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16490 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
164a0 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
164b0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
164c0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
164d0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
164e0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
164f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
16500 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16510 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
16520 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
16530 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
16540 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
16550 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16560 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16570 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16580 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16590 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
165a0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
165b0 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
165c0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
165d0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
165e0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
165f0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
16600 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
16610 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16620 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16630 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16640 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16650 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16660 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16670 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16680 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16690 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
166a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
166b0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
166c0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
166d0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
166e0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
166f0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
16700 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
16710 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16720 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16730 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16740 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16750 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16760 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16770 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16780 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
16790 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
167a0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
167b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
167c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
167d0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
167e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
167f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16800 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
16810 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16820 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16830 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16840 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16850 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16860 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16870 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16880 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16890 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
168a0 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
168b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
168c0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
168d0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
168e0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
168f0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
16900 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
16910 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
16920 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
16930 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
16940 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
16950 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
16960 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
16970 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16980 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
16990 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
169a0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
169b0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
169c0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
169d0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
169e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
169f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
16a00 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
16a10 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
16a20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
16a30 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
16a40 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16a50 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
16a60 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
16a70 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
16a80 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
16a90 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
16aa0 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
16ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
16ac0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
16ad0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16ae0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
16af0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
16b00 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16b10 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16b20 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
16b30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
16b40 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16b50 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
16b60 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
16b70 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
16b80 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16b90 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
16ba0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16bb0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16bc0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
16bd0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
16be0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
16bf0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16c00 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
16c10 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
16c20 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
16c30 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
16c40 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
16c50 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
16c60 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
16c70 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
16c80 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
16c90 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
16ca0 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
16cb0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
16cc0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16cd0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
16ce0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
16cf0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
16d00 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
16d10 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
16d20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
16d30 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
16d40 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16d50 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16d60 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
16d70 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
16d80 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
16d90 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
16da0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
16db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16dc0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
16dd0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
16de0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
16df0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
16e00 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
16e10 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
16e20 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
16e30 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
16e40 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
16e50 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
16e60 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
16e70 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
16e80 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
16e90 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
16ea0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
16eb0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
16ec0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
16ed0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
16ee0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
16ef0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
16f00 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
16f10 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
16f20 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
16f30 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
16f40 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
16f50 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
16f60 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
16f70 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
16f80 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
16f90 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
16fa0 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
16fb0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16fc0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
16fd0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
16fe0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
16ff0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17000 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17010 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
17020 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17030 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17040 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17050 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17060 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17070 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17080 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17090 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
170a0 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
170b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
170c0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
170d0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
170e0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
170f0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
17100 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17110 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
17120 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17130 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
17140 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
17150 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
17160 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17170 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
17180 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
17190 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
171a0 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
171b0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
171c0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
171d0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
171e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
171f0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
17200 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
17210 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
17220 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
17230 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
17240 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
17250 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17260 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17270 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17280 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
17290 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
172a0 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
172b0 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
172c0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
172d0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
172e0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
172f0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
17300 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
17310 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
17320 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17340 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
17350 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
17360 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
17370 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
17380 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
17390 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
173a0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
173b0 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
173c0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
173d0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
173e0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
173f0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
17400 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
17410 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
17420 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
17430 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17440 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
17450 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
17460 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
17470 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
17480 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17490 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
174a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
174b0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
174c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
174d0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
174e0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
174f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17500 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
17510 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
17520 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
17530 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
17540 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
17550 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
17560 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
17570 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
17580 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
17590 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
175a0 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
175b0 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
175c0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
175d0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
175e0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
175f0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
17600 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
17610 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17620 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17630 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
17640 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
17650 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
17660 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17670 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
17680 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
17690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
176a0 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
176b0 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
176c0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
176d0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
176e0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
176f0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17700 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17710 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
17740 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
17750 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
17760 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
17770 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17780 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
177b0 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
177c0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
177d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
177e0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
177f0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
17800 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
17810 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
17820 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
17830 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
17840 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17850 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
17860 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
17870 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
17880 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
17890 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
178a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
178b0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
178c0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
178d0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
178e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
178f0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
17900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17910 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
17920 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17930 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
17940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17950 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
17960 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17970 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
17980 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17990 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
179a0 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
179b0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
179c0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
179d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
179e0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
179f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
17a00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
17a10 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
17a20 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
17a30 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
17a40 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
17a50 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
17a60 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
17a70 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
17a80 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
17a90 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
17aa0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
17ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ac0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
17ad0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
17ae0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
17af0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
17b00 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
17b10 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17b20 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17b30 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
17b40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17b50 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17b60 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17b70 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
17b80 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17b90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17ba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17bb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
17bc0 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
17bd0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17be0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
17bf0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
17c10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17c20 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
17c30 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
17c40 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
17c50 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
17c60 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
17c70 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
17c80 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
17c90 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
17ca0 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
17cb0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
17cc0 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
17cd0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
17ce0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
17cf0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
17d00 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
17d10 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
17d20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
17d30 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
17d40 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17d50 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
17d60 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
17d70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
17d80 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
17d90 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
17da0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
17db0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
17dc0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
17dd0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
17de0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
17df0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17e00 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
17e10 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
17e20 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
17e30 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17e40 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
17e50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
17e60 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
17e70 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
17e80 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
17e90 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
17ea0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
17eb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
17ec0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
17ed0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
17ee0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
17ef0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17f00 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
17f10 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
17f20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
17f30 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
17f40 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
17f50 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
17f60 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
17f70 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
17f80 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
17f90 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
17fa0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
17fb0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
17fc0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
17fd0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
17fe0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
17ff0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
18000 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
18010 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
18020 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
18030 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
18040 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
18050 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
18060 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
18070 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
18080 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
18090 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
180a0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
180b0 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
180c0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
180d0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
180e0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
180f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
18100 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
18110 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18120 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
18130 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18140 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
18150 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
18160 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
18170 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
18180 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
18190 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
181a0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
181b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
181c0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
181d0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
181e0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
181f0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
18200 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
18210 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
18220 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18230 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
18240 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
18250 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
18260 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
18270 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
18280 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
18290 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
182a0 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
182b0 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
182c0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
182d0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
182e0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
182f0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
18300 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
18310 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
18320 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
18330 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
18340 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18350 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
18360 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
18370 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
18380 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
18390 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
183a0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
183b0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
183c0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
183d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
183e0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
183f0 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
18400 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
18410 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
18420 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18430 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18440 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
18450 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18460 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
18470 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
18480 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
18490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
184a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
184b0 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
184c0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
184d0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
184e0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
184f0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
18500 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
18510 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
18520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
18530 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
18540 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
18550 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
18560 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
18570 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
18580 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
18590 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
185a0 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
185b0 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
185c0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
185d0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
185e0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
185f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18600 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
18610 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
18620 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18630 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
18640 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
18650 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
18660 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
18670 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18680 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
18690 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
186a0 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
186b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
186c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
186d0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
186e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
186f0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
18700 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18710 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18720 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
18730 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
18740 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
18750 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18760 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
18770 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18780 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
18790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
187a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
187b0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
187c0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
187d0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
187e0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
187f0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
18800 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
18810 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
18820 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
18830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
18840 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18850 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18860 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
18870 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18880 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
18890 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
188a0 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
188b0 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
188c0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
188d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
188e0 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
188f0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
18900 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18910 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
18920 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18930 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18940 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
18950 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
18960 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
18970 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
18980 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
18990 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
189a0 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
189b0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
189c0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
189d0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
189e0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
189f0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
18a00 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
18a10 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
18a20 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
18a30 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
18a40 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
18a50 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
18a60 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
18a70 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
18a80 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
18a90 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
18aa0 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
18ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
18ac0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
18ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
18ae0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18af0 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
18b00 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
18b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
18b20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
18b30 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
18b40 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18b50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18b60 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
18b70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18b80 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18b90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18ba0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
18bb0 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
18bc0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18bd0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
18be0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
18bf0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
18c00 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
18c10 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
18c20 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
18c30 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
18c40 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
18c50 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
18c60 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
18c70 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
18c80 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
18c90 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
18ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
18cb0 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
18cc0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18cd0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d30 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
18d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
18d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18da0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
18db0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
18dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dd0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
18de0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18df0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18e00 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18e10 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
18e20 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18e30 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
18e40 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
18e50 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
18e60 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
18e70 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
18e80 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
18e90 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
18ea0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
18eb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18ec0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
18ed0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
18ee0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
18ef0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
18f00 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18f10 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
18f20 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
18f30 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18f40 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
18f50 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
18f60 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
18f70 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   1);.}..#endif /
18f80 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18f90 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18fa0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18fb0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
18fc0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
18fd0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
18fe0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
18ff0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
19000 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
19010 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
19020 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
19030 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
19040 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
19050 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a  available.  .**.
19060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19070 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
19080 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
19090 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
190a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
190b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
19100 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
19110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19150 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19160 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71  * Non-locking sq
19170 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
19180 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
19190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
191b0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
191c0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
191d0 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64  s for all method
191e0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s of the .** sql
191f0 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74  ite3_file object
19200 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
19210 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e  locking methods.
19220 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a    The locking.**
19230 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65   methods were de
19240 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f  fined in divisio
19250 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f  ns above (one lo
19260 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72  cking method per
19270 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20  .** division).  
19280 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68  Those methods th
19290 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f  at are common to
192a0 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64   all locking mod
192b0 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72  es.** are gather
192c0 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74   together into t
192d0 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  his division..*/
192e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
192f0 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65  the offset passe
19300 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
19310 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72  argument, then r
19320 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65  ead cnt .** byte
19330 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74  s into pBuf. Ret
19340 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19350 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19360 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a   read..**.** NB:
19370 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20    If you define 
19380 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45  USE_PREAD or USE
19390 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69  _PREAD64, then i
193a0 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20  t might also.** 
193b0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
193c0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
193d0 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20  URCE to be 500. 
193e0 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f   This varies fro
193f0 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20  m.** one system 
19400 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e  to another.  Sin
19410 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  ce SQLite does n
19420 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ot define USE_PR
19430 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66  EAD.** any any f
19440 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
19450 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
19460 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
19470 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
19480 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
19490 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
194a0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
194b0 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
194c0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
194d0 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
194e0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
194f0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
19500 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
19510 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
19520 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
19530 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19540 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
19550 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19560 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
19570 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
19580 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
19590 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
195a0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
195b0 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
195c0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
195d0 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
195e0 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
195f0 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66    cnt &= 0x1ffff
19600 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
19610 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19620 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
19630 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19640 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19650 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19660 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19670 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19680 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
19690 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
196a0 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
196b0 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
196c0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
196d0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
196e0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
196f0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
19700 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
19710 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19720 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
19730 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19740 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
19750 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
19760 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
19770 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19780 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19790 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
197a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
197b0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
197c0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  stErrno = 0;.   
197d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
197e0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
197f0 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
19800 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19810 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19820 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19830 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19840 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19850 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19860 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19870 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19880 3b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  ;.      ((unixFi
19890 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
198a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
198b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
198c0 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  se if( got>0 ){.
198d0 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74        cnt -= got
198e0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
198f0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69  = got;.      pri
19900 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  or += got;.     
19910 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28   pBuf = (void*)(
19920 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75  got + (char*)pBu
19930 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  f);.    }.  }whi
19940 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54  le( got>0 );.  T
19950 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
19960 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
19970 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
19980 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u\n",.          
19990 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69    id->h, got+pri
199a0 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72  or, offset-prior
199b0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
199c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b  );.  return got+
199d0 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  prior;.}../*.** 
199e0 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
199f0 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
19a00 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
19a10 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
19a20 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
19a30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
19a40 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
19a50 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19a60 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
19a70 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
19a80 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
19a90 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
19aa0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
19ab0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
19ac0 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
19ad0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19ae0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
19af0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
19b00 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
19b10 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
19b20 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
19b30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
19b40 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
19b50 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
19b60 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
19b70 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
19b80 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
19b90 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
19ba0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
19bb0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
19bc0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
19bd0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19be0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
19bf0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
19c00 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
19c10 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
19c20 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
19c30 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
19c40 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
19c50 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
19c60 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
19c70 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
19c80 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
19c90 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
19ca0 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
19cb0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
19cc0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
19cd0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
19ce0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
19cf0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
19d00 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
19d10 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
19d20 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
19d30 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
19d40 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
19d50 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
19d60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19d70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
19d80 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
19d90 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
19da0 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
19db0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
19dc0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
19dd0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
19de0 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
19df0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
19e00 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
19e10 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
19e20 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
19e30 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
19e40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
19e50 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
19e60 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
19e70 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
19e80 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
19e90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19ea0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
19eb0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19ec0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
19ed0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
19ee0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
19ef0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
19f00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19f10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
19f20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79  = 0; /* not a sy
19f30 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
19f40 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
19f50 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
19f60 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
19f70 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
19f80 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
19f90 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
19fa0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
19fb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
19fc0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
19fd0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
19fe0 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65  seek the file-de
19ff0 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20  scriptor passed 
1a000 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1a010 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f  ument to.** abso
1a020 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66  lute offset iOff
1a030 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74  , then attempt t
1a040 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74  o write nBuf byt
1a050 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a  es of data from.
1a060 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49  ** pBuf to it. I
1a070 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a080 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64  s, return -1 and
1a090 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f   set *piErrno. O
1a0a0 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65  therwise, .** re
1a0b0 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20  turn the actual 
1a0c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a0d0 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d  written (which m
1a0e0 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a  ay be less than.
1a0f0 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61  ** nBuf)..*/.sta
1a100 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1a110 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64  riteFd(.  int fd
1a120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a140 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1a150 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1a160 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20  4 iOff,         
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a180 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20   File offset to 
1a190 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
1a1a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1a1b0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1a1c0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
1a1d0 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1a1e0 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20  fer to the file 
1a1f0 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20  */.  int nBuf,  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a220 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62  buffer pBuf in b
1a230 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
1a240 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20  iErrno          
1a250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a260 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69  : Error number i
1a270 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  f error occurs *
1a280 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a290 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a2a0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1a2b0 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74  returned by syst
1a2c0 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73  em call */..  as
1a2d0 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75  sert( nBuf==(nBu
1a2e0 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  f&0x1ffff) );.  
1a2f0 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b  nBuf &= 0x1ffff;
1a300 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1a310 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1a320 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63  _PREAD).  do{ rc
1a330 20 3d 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20   = osPwrite(fd, 
1a340 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
1a350 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
1a360 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
1a370 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1a380 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1a390 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1a3a0 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  e64(fd, pBuf, nB
1a3b0 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65  uf, iOff);}while
1a3c0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1a3d0 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
1a3e0 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65   do{.    i64 iSe
1a3f0 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69  ek = lseek(fd, i
1a400 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  Off, SEEK_SET);.
1a410 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1a420 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b 0a  ror( iSeek-- );.
1a430 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 21 3d  .    if( iSeek!=
1a440 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 69 66  iOff ){.      if
1a450 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45  ( piErrno ) *piE
1a460 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d 2d  rrno = (iSeek==-
1a470 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b 0a  1 ? errno : 0);.
1a480 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1a490 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1a4a0 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75 66  osWrite(fd, pBuf
1a4b0 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c  , nBuf);.  }whil
1a4c0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1a4d0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
1a4e0 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  f..  TIMER_END;.
1a4f0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
1a500 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
1a510 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20  ld %llu\n", fd, 
1a520 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f  rc, iOff, TIMER_
1a530 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66  ELAPSED));..  if
1a540 28 20 72 63 3c 30 20 26 26 20 70 69 45 72 72 6e  ( rc<0 && piErrn
1a550 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65  o ) *piErrno = e
1a560 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72  rrno;.  return r
1a570 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  c;.}.../*.** See
1a580 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
1a590 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
1a5a0 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
1a5b0 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
1a5c0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1a5d0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1a5e0 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
1a5f0 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a  e the offset..**
1a600 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1a610 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1a620 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1a630 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74  d write the last
1a640 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
1a650 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
1a660 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1a670 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1a680 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  te(unixFile *id,
1a690 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e   i64 offset, con
1a6a0 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
1a6b0 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72  nt cnt){.  retur
1a6c0 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  n seekAndWriteFd
1a6d0 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
1a6e0 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e  pBuf, cnt, &id->
1a6f0 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a  lastErrno);.}...
1a700 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1a710 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
1a720 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
1a730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1a740 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
1a750 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1a760 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
1a770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a780 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69  nixWrite(.  sqli
1a790 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1a7a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1a7b0 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20  f, .  int amt,. 
1a7c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1a7d0 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78  ffset .){.  unix
1a7e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1a7f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1a800 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
1a810 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
1a820 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
1a830 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1a840 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1a850 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1a860 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1a870 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1a880 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1a890 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1a8a0 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1a8b0 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1a8c0 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1a8d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1a8e0 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
1a8f0 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
1a900 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
1a910 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
1a920 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
1a930 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
1a940 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a950 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  G.  /* If we are
1a960 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1a970 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1a980 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1a990 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69  osed to.  ** doi
1a9a0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1a9b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1a9c0 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1a9d0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1a9e0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1a9f0 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72  ase file) then r
1aa00 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
1aa10 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1aa20 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65  .  ** has change
1aa30 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
1aa40 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1aa50 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f  s modified, reco
1aa60 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63  rd that.  ** fac
1aa70 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  t too..  */.  if
1aa80 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
1aa90 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46  lWrite ){.    pF
1aaa0 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
1aab0 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  1;  /* The datab
1aac0 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
1aad0 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  ified */.    if(
1aae0 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f   offset<=24 && o
1aaf0 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b  ffset+amt>=27 ){
1ab00 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1ab10 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74       char oldCnt
1ab20 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75  r[4];.      Simu
1ab30 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1ab40 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1ab50 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1ab60 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c  le, 24, oldCntr,
1ab70 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   4);.      Simul
1ab80 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1ab90 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  (0);.      if( r
1aba0 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f  c!=4 || memcmp(o
1abb0 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a  ldCntr, &((char*
1abc0 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74  )pBuf)[24-offset
1abd0 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ], 4)!=0 ){.    
1abe0 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1abf0 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f  CntrChng = 1;  /
1ac00 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1ac10 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68  n counter has ch
1ac20 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d  anged */.      }
1ac30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1ac40 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
1ac50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1ac60 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1ac70 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69  much of this wri
1ac80 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  te request as po
1ac90 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
1aca0 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
1acb0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
1acc0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
1acd0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
1ace0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
1acf0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1ad00 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1ad10 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1ad20 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1ad30 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1ad40 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1ad50 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d  ffset], pBuf, am
1ad60 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1ad70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ad80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1ad90 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
1ada0 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
1adb0 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
1adc0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1add0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1ade0 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70  set], pBuf, nCop
1adf0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
1ae00 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
1ae10 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
1ae20 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1ae30 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
1ae40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1ae50 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74  if..  while( amt
1ae60 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73  >0 && (wrote = s
1ae70 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1ae80 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
1ae90 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20   amt))>0 ){.    
1aea0 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
1aeb0 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74    offset += wrot
1aec0 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28  e;.    pBuf = &(
1aed0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f  (char*)pBuf)[wro
1aee0 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c  te];.  }.  Simul
1aef0 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f  ateIOError(( wro
1af00 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29  te=(-1), amt=1 )
1af10 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
1af20 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f  kfullError(( wro
1af30 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  te=0, amt=1 ));.
1af40 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
1af50 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
1af60 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  && pFile->lastEr
1af70 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20  rno!=ENOSPC ){. 
1af80 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
1af90 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1afa0 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
1afb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1afc0 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
1afd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1afe0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
1aff0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1b000 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1b010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1b020 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
1b030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b040 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1b050 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
1b060 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1b070 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
1b080 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
1b090 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1b0a0 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
1b0b0 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
1b0c0 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
1b0d0 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
1b0e0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1b0f0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
1b100 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
1b110 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
1b120 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1b130 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
1b140 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
1b150 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
1b160 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
1b170 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
1b180 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
1b190 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
1b1a0 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74  with the (slight
1b1b0 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73  ly slower).** fs
1b1c0 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e  ync(). If you kn
1b1d0 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73  ow that your sys
1b1e0 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74  tem does support
1b1f0 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72   fdatasync() cor
1b200 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20  rectly,.** then 
1b210 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77  simply compile w
1b220 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d  ith -Dfdatasync=
1b230 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66  fdatasync.*/.#if
1b240 20 21 64 65 66 69 6e 65 64 28 66 64 61 74 61 73   !defined(fdatas
1b250 79 6e 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64  ync).# define fd
1b260 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
1b270 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
1b280 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b290 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
1b2a0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1b2b0 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
1b2c0 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
1b2d0 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
1b2e0 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
1b2f0 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
1b300 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
1b310 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
1b320 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
1b330 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
1b340 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
1b350 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
1b360 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
1b370 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
1b380 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
1b390 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
1b3a0 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
1b3b0 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
1b3c0 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
1b3d0 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
1b3e0 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
1b3f0 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
1b400 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
1b410 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
1b420 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
1b430 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
1b440 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
1b450 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
1b460 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
1b470 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
1b480 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
1b490 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
1b4a0 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
1b4b0 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
1b4c0 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
1b4d0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1b4e0 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
1b4f0 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
1b500 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1b510 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
1b520 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
1b530 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
1b540 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
1b550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b560 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  le..**.** SQLite
1b570 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e   sets the dataOn
1b580 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73  ly flag if the s
1b590 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1b5a0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
1b5b0 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64   The idea behind
1b5c0 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61   dataOnly is tha
1b5d0 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  t it should only
1b5e0 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
1b5f0 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69  content.** to di
1b600 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64  sk, not the inod
1b610 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20  e.  We only set 
1b620 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20  dataOnly if the 
1b630 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a  file size is .**
1b640 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65   unchanged since
1b650 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1b660 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
1b670 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a  ode.  However, .
1b680 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c  ** Ted Ts'o tell
1b690 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73  s us that fdatas
1b6a0 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20  ync() will also 
1b6b0 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20  write the inode 
1b6c0 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73  if the.** file s
1b6d0 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ize has changed.
1b6e0 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20    The only real 
1b6f0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1b700 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a  en fdatasync().*
1b710 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54  * and fsync(), T
1b720 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20  ed tells us, is 
1b730 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1b740 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20   will not flush 
1b750 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20  the.** inode if 
1b760 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e  the mtime or own
1b770 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64  er or other inod
1b780 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76  e attributes hav
1b790 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65  e changed..** We
1b7a0 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
1b7b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1b7c0 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69  not the other fi
1b7d0 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73  le attributes, s
1b7e0 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53  o.** as far as S
1b7f0 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e  QLite is concern
1b800 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63  ed, an fdatasync
1b810 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65  () is always ade
1b820 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65  quate..** So, we
1b830 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74   always use fdat
1b840 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73  async() if it is
1b850 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61   available, rega
1b860 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65  rdless of.** the
1b870 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
1b880 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a  taOnly flag..*/.
1b890 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
1b8a0 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
1b8b0 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
1b8c0 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
1b8d0 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66   rc;..  /* The f
1b8e0 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f  ollowing "ifdef/
1b8f0 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63  elif/else/" bloc
1b900 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  k has the same s
1b910 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a  tructure as.  **
1b920 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20   the one below. 
1b930 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64  It is replicated
1b940 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20   here solely to 
1b950 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67  avoid cluttering
1b960 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65   .  ** up the re
1b970 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65  al code with the
1b980 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b990 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f  R() macros..  */
1b9a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1b9b0 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  O_SYNC.  UNUSED_
1b9c0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1b9d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b9e0 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1b9f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ba00 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66  dataOnly);.#elif
1ba10 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1ba20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ba30 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1ba40 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
1ba50 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1ba60 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1ba70 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1ba80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
1ba90 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
1baa0 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
1bab0 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
1bac0 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
1bad0 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
1bae0 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
1baf0 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
1bb00 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
1bb10 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
1bb20 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
1bb30 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
1bb40 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1bb50 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
1bb60 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
1bb70 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
1bb80 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
1bb90 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
1bba0 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
1bbb0 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
1bbc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
1bbd0 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
1bbe0 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
1bbf0 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
1bc00 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72  LITE_NO_SYNC.  r
1bc10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
1bc20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1bc30 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1bc40 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nc ){.    rc = o
1bc50 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c  sFcntl(fd, F_FUL
1bc60 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
1bc70 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
1bc80 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
1bc90 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
1bca0 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
1bcb0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
1bcc0 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
1bcd0 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
1bce0 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
1bcf0 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
1bd00 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
1bd10 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
1bd20 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
1bd30 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
1bd40 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
1bd50 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
1bd60 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
1bd70 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
1bd80 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
1bd90 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
1bda0 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
1bdb0 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
1bdc0 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
1bdd0 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
1bde0 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
1bdf0 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
1be00 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
1be10 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
1be20 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
1be30 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
1be40 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
1be50 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
1be60 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
1be70 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61  PPLE__).  /* fda
1be80 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b  tasync() on HFS+
1be90 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75   doesn't yet flu
1bea0 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  sh the file size
1beb0 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63   if it changed c
1bec0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f  orrectly.  ** so
1bed0 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65   currently we de
1bee0 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63  fault to the mac
1bef0 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65  ro that redefine
1bf00 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66  s fdatasync to f
1bf10 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  sync.  */.  rc =
1bf20 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73   fsync(fd);.#els
1bf30 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73  e .  rc = fdatas
1bf40 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f  ync(fd);.#if OS_
1bf50 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1bf60 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ==-1 && errno==E
1bf70 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63  NOTSUP ){.    rc
1bf80 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
1bf90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
1bfa0 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66  XWORKS */.#endif
1bfb0 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
1bfc0 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
1bfd0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
1bfe0 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b  .  if( OS_VXWORK
1bff0 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
1c000 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
1c010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c020 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1c030 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1c040 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1c050 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
1c060 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
1c070 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
1c080 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
1c090 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
1c0a0 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
1c0b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c0c0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
1c0d0 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
1c0e0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
1c0f0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1c100 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1c110 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1c120 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
1c130 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  value..**.** The
1c140 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
1c150 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73  descriptor is us
1c160 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20  ed for only one 
1c170 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73  thing - to.** fs
1c180 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72  ync() a director
1c190 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66  y to make sure f
1c1a0 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  ile creation and
1c1b0 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73   deletion events
1c1c0 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20  .** are flushed 
1c1d0 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66  to disk.  Such f
1c1e0 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65  syncs are not ne
1c1f0 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a  eded on newer.**
1c200 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65   journaling file
1c210 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65  systems, but are
1c220 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64   required on old
1c230 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  er filesystems..
1c240 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c250 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  ne can be overri
1c260 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78  dden using the x
1c270 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72  SetSysCall inter
1c280 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69  face..** The abi
1c290 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
1c2a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1c2b0 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f  s added in suppo
1c2c0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72  rt of the.** chr
1c2d0 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20  omium sandbox.  
1c2e0 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74  Opening a direct
1c2f0 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74  ory is a securit
1c300 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a  y risk (we are.*
1c310 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e  * told) so makin
1c320 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c  g it overrideabl
1c330 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72  e allows the chr
1c340 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f  omium sandbox to
1c350 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73  .** replace this
1c360 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
1c370 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20  harmless no-op. 
1c380 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f   To make this ro
1c390 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  utine.** a no-op
1c3a0 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  , replace it wit
1c3b0 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65  h a stub that re
1c3c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c3d0 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70  but leaves.** *p
1c3e0 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61  Fd set to a nega
1c3f0 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  tive number..**.
1c400 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1c410 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1c420 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1c430 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
1c440 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
1c450 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
1c460 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
1c470 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
1c480 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
1c490 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1c4a0 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
1c4b0 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
1c4c0 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
1c4d0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
1c4e0 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
1c4f0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1c500 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
1c510 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
1c520 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
1c530 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
1c540 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72  e); ii>1 && zDir
1c550 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
1c560 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
1c570 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
1c580 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
1c590 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
1c5a0 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
1c5b0 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
1c5c0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  );.    if( fd>=0
1c5d0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1c5e0 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
1c5f0 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
1c600 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  name));.    }.  
1c610 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1c620 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
1c630 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67  QLITE_OK:unixLog
1c640 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1c650 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1c660 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a  n", zDirname));.
1c670 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1c680 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
1c690 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
1c6a0 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
1c6b0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1c6c0 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
1c6d0 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
1c6e0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
1c6f0 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
1c700 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
1c710 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
1c720 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
1c730 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
1c740 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
1c750 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
1c760 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
1c770 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
1c780 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
1c790 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
1c7a0 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
1c7b0 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
1c7c0 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
1c7d0 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
1c7e0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
1c7f0 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
1c800 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
1c810 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
1c820 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
1c830 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
1c840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1c850 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
1c860 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
1c870 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
1c880 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
1c890 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
1c8a0 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
1c8b0 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
1c8c0 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
1c8d0 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1c8e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
1c8f0 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
1c900 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c910 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
1c920 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
1c930 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
1c940 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1c950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c960 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
1c970 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
1c980 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
1c990 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1c9a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1c9b0 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
1c9c0 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
1c9d0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1c9e0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
1c9f0 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
1ca00 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1ca10 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
1ca20 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
1ca30 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1ca40 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
1ca50 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
1ca60 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
1ca70 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
1ca80 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
1ca90 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1caa0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
1cab0 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
1cac0 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
1cad0 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
1cae0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
1caf0 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
1cb00 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
1cb10 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
1cb20 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1cb30 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
1cb40 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1cb50 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
1cb60 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
1cb70 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1cb80 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1cb90 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
1cba0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
1cbb0 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
1cbc0 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
1cbd0 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
1cbe0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1cbf0 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
1cc00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1cc10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1cc20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1cc30 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1cc40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
1cc50 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c  C, "full_fsync",
1cc60 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1cc70 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66    }..  /* Also f
1cc80 73 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f  sync the directo
1cc90 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
1cca0 65 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49  e file if the DI
1ccb0 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20  RSYNC flag.  ** 
1ccc0 69 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73  is set.  This is
1ccd0 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75   a one-time occu
1cce0 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79  rrence.  Many sy
1ccf0 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a  stems (examples:
1cd00 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75   AIX).  ** are u
1cd10 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61  nable to fsync a
1cd20 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69   directory, so i
1cd30 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20  gnore errors on 
1cd40 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a  the fsync..  */.
1cd50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
1cd60 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
1cd70 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20  E_DIRSYNC ){.   
1cd80 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20   int dirfd;.    
1cd90 4f 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e  OSTRACE(("DIRSYN
1cda0 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66  C %s (have_fullf
1cdb0 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63  sync=%d fullsync
1cdc0 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%d)\n", pFile->
1cdd0 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20  zPath,.         
1cde0 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e     HAVE_FULLFSYN
1cdf0 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b  C, isFullsync));
1ce00 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
1ce10 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d  Directory(pFile-
1ce20 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b  >zPath, &dirfd);
1ce30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ce40 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e  ITE_OK && dirfd>
1ce50 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  =0 ){.      full
1ce60 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1ce70 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1ce80 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1ce90 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1cea0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
1ceb0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
1cec0 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
1ced0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cee0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  }.    pFile->ctr
1cef0 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46  lFlags &= ~UNIXF
1cf00 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d  ILE_DIRSYNC;.  }
1cf10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cf20 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
1cf30 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
1cf40 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
1cf50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1cf60 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
1cf70 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
1cf80 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78  4 nByte){.  unix
1cf90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1cfa0 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
1cfb0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
1cfc0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
1cfd0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1cfe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1cff0 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20  R_TRUNCATE );.. 
1d000 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
1d010 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
1d020 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
1d030 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
1d040 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
1d050 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
1d060 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
1d070 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
1d080 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
1d090 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
1d0a0 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
1d0b0 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
1d0c0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1d0d0 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
1d0e0 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
1d0f0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1d100 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
1d110 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
1d120 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
1d130 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
1d140 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
1d150 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62  .  }..  rc = rob
1d160 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1d170 69 6c 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  ile->h, (off_t)n
1d180 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1d190 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1d1a0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
1d1b0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1d1c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d1d0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
1d1e0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
1d1f0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
1d200 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1d210 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1d220 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1d230 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
1d240 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
1d250 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
1d260 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
1d270 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1d280 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1d290 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1d2a0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
1d2b0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
1d2c0 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
1d2d0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1d2e0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
1d2f0 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
1d300 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
1d310 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1d320 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
1d330 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
1d340 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
1d350 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1d360 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
1d370 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
1d380 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
1d390 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
1d3a0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1d3b0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
1d3c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
1d3d0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1d3e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1d3f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1d400 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e  le was just trun
1d410 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
1d420 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1d430 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
1d440 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
1d450 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1d460 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
1d470 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
1d480 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75  te will.    ** u
1d490 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
1d4a0 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
1d4b0 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
1d4c0 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
1d4d0 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  on.  .    */.   
1d4e0 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65   if( nByte<pFile
1d4f0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1d500 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1d510 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
1d520 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53   }..    return S
1d530 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1d540 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1d550 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1d560 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1d570 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1d580 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1d590 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d5a0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1d5b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1d5c0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1d5d0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1d5e0 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1d5f0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1d600 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1d610 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1d620 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1d630 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
1d640 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
1d650 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75   errno;.    retu
1d660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d670 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
1d680 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
1d690 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
1d6a0 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
1d6b0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1d6c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
1d6d0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
1d6e0 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
1d6f0 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
1d700 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
1d710 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
1d720 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
1d730 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
1d740 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
1d750 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
1d760 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
1d770 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
1d780 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
1d790 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
1d7a0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1d7b0 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
1d7c0 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
1d7d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
1d7e0 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
1d7f0 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
1d800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1d810 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d820 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1d830 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1d840 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
1d850 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
1d860 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
1d870 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
1d880 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
1d890 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
1d8a0 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
1d8b0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
1d8c0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1d8d0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
1d8e0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
1d8f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d900 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
1d910 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
1d920 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1d930 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
1d940 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e  l operation.  En
1d950 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61  large the databa
1d960 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20  se to nBytes in 
1d970 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64  size.** (rounded
1d980 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1d990 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66  chunk-size).  If
1d9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d9b0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74   already.** nByt
1d9c0 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68  es or larger, th
1d9d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1d9e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1d9f0 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
1da00 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
1da10 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
1da20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1da30 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36  hunk>0 ){.    i6
1da40 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
1da50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1da60 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1da70 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1da80 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
1da90 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1daa0 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
1dab0 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
1dac0 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
1dad0 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
1dae0 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
1daf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1db00 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d  AT;..    nSize =
1db10 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1db20 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1db30 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1db40 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1db50 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1db60 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1db70 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1db80 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1db90 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1dba0 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1dbb0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1dbc0 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1dbd0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1dbe0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1dbf0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1dc00 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1dc10 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1dc20 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1dc30 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1dc40 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1dc50 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1dc60 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1dc70 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1dc80 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1dc90 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1dca0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1dcb0 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1dcc0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1dcd0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1dce0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1dcf0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1dd00 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1dd10 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1dd20 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1dd30 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1dd40 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1dd50 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1dd60 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1dd70 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20  it. First use.  
1dd80 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65      ** ftruncate
1dd90 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69  () to set the fi
1dda0 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72  le size, then wr
1ddb0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ite a single byt
1ddc0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  e to.      ** th
1ddd0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1dde0 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ach block within
1ddf0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1de00 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20  gion. This.     
1de10 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1de20 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62  technique used b
1de30 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65  y glibc to imple
1de40 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  ment posix_fallo
1de50 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  cate().      ** 
1de60 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
1de70 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
1de80 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73  al fallocate() s
1de90 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20  ystem call..    
1dea0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1deb0 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1dec0 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1ded0 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1dee0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1def0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1df00 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1df10 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1df20 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
1df30 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1df40 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29  pFile->h, nSize)
1df50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1df60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
1df70 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  rrno;.        re
1df80 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1df90 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
1dfa0 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63  RUNCATE, "ftrunc
1dfb0 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ate", pFile->zPa
1dfc0 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
1dfd0 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62 75     iWrite = ((bu
1dfe0 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42  f.st_size + 2*nB
1dff0 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42  lk - 1)/nBlk)*nB
1e000 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c  lk-1;.      whil
1e010 65 28 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 20  e( iWrite<nSize 
1e020 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1e030 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  Write = seekAndW
1e040 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69  rite(pFile, iWri
1e050 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20  te, "", 1);.    
1e060 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
1e070 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
1e080 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1e090 20 20 20 20 20 20 20 69 57 72 69 74 65 20 2b 3d         iWrite +=
1e0a0 20 6e 42 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23   nBlk;.      }.#
1e0b0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1e0c0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d  .  if( pFile->mm
1e0d0 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e  apSizeMax>0 && n
1e0e0 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte>pFile->mmap
1e0f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Size ){.    int 
1e100 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  rc;.    if( pFil
1e110 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b  e->szChunk<=0 ){
1e120 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73  .      if( robus
1e130 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1e140 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a  e->h, nByte) ){.
1e150 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
1e160 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
1e170 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e180 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1e190 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1e1a0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1e1b0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1e1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e1d0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70      rc = unixMap
1e1e0 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  file(pFile, nByt
1e1f0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
1e200 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
1e210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e220 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1e230 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
1e240 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
1e250 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
1e260 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
1e270 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
1e280 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1e290 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
1e2a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
1e2b0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
1e2c0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
1e2d0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
1e2e0 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
1e2f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1e300 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1e310 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e  d unixModeBit(un
1e320 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
1e330 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
1e340 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
1e350 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
1e360 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
1e370 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1e380 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
1e390 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
1e3a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1e3b0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
1e3c0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
1e3d0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e3e0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
1e3f0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1e400 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
1e410 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
1e420 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
1e430 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a  char *zBuf);../*
1e440 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
1e450 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
1e460 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
1e470 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e480 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
1e490 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
1e4a0 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
1e4b0 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46   *pArg){.  unixF
1e4c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1e4d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  ixFile*)id;.  sw
1e4e0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1e4f0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e500 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1e510 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1e520 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1e530 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1e540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e550 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e560 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
1e570 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1e580 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  rg = pFile->last
1e590 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
1e5a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e5b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e5c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1e5d0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1e5e0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1e5f0 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1e600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e610 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e620 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e630 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
1e640 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1e650 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1e660 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1e670 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a     rc = fcntlSiz
1e680 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69  eHint(pFile, *(i
1e690 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  64 *)pArg);.    
1e6a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e6b0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1e6c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e6d0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e6e0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
1e6f0 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e  _WAL: {.      un
1e700 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  ixModeBit(pFile,
1e710 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
1e720 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1e730 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1e740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e750 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e760 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1e770 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1e780 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74       unixModeBit
1e790 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45  (pFile, UNIXFILE
1e7a0 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72  _PSOW, (int*)pAr
1e7b0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1e7c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e7d0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e7e0 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1e7f0 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1e800 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1e810 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1e820 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1e830 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1e840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e850 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e860 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
1e870 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
1e880 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c  ar *zTFile = sql
1e890 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46 69  ite3_malloc( pFi
1e8a0 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1e8b0 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
1e8c0 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
1e8d0 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
1e8e0 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
1e8f0 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
1e900 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
1e910 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
1e920 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
1e930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e940 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e950 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e960 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1e970 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1e980 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1e990 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1e9a0 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
1e9b0 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
1e9c0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1e9d0 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
1e9e0 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
1e9f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1ea00 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
1ea10 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
1ea20 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1ea30 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit>=0 ){.      
1ea40 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1ea50 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1ea60 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  .        if( new
1ea70 4c 69 6d 69 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  Limit<pFile->mma
1ea80 70 53 69 7a 65 20 29 20 70 46 69 6c 65 2d 3e 6d  pSize ) pFile->m
1ea90 6d 61 70 53 69 7a 65 20 3d 20 6e 65 77 4c 69 6d  mapSize = newLim
1eaa0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
1eab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eac0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  OK;.    }.#ifdef
1ead0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1eae0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
1eaf0 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
1eb00 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
1eb10 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
1eb20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
1eb30 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
1eb40 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
1eb50 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
1eb60 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
1eb70 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1eb80 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
1eb90 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
1eba0 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
1ebb0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
1ebc0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ebd0 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
1ebe0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1ebf0 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
1ec00 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1ec10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ec20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
1ec30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1ec40 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1ec50 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1ec60 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ec70 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1ec80 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1ec90 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1eca0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1ecb0 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1ecc0 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1ecd0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1ece0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1ecf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1ed00 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1ed10 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
1ed20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1ed30 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1ed40 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1ed50 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1ed60 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1ed70 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1ed80 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1ed90 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1eda0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1edb0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1edc0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1edd0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1ede0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1edf0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1ee00 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1ee10 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1ee20 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1ee30 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1ee40 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1ee50 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1ee60 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1ee70 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1ee80 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1ee90 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1eea0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1eeb0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1eec0 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  both..*/.#ifndef
1eed0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61   __QNXNTO__ .sta
1eee0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1eef0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1ef00 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1ef10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ef20 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1ef30 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1ef40 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1ef50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ef60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1ef70 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65  ersion of unixSe
1ef80 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70  ctorSize() is op
1ef90 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e  timized for QNX.
1efa0 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58  .*/.#ifdef __QNX
1efb0 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c  NTO__.#include <
1efc0 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a  sys/dcmd_blk.h>.
1efd0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
1efe0 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20  atvfs.h>.static 
1eff0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1f000 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1f010 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
1f020 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1f030 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
1f040 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f050 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72   == 0 ){.    str
1f060 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e  uct statvfs fsIn
1f070 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20  fo;.       .    
1f080 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20  /* Set defaults 
1f090 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65  for non-supporte
1f0a0 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f  d filesystems */
1f0b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
1f0c0 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
1f0d0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1f0e0 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  IZE;.    pFile->
1f0f0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f100 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69  stics = 0;.    i
1f110 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c  f( fstatvfs(pFil
1f120 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  e->h, &fsInfo) =
1f130 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72  = -1 ) {.      r
1f140 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1f150 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  torSize;.    }..
1f160 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
1f170 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f180 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20  e, "tmp") ) {.  
1f190 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f1a0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f1b0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f1c0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f1d0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f1e0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f1f0 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20  P_ATOMIC4K |    
1f200 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69     /* All ram fi
1f210 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
1f220 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1f230 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f240 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f250 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f260 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f270 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f2b0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f2c0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f2d0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f2e0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f2f0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f300 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f330 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f340 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f350 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f360 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
1f370 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66  f_basetype, "etf
1f380 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1f390 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f3a0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f3b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f3c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f3d0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1f3e0 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69   etfs cluster si
1f3f0 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74  ze writes are at
1f400 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f410 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1f420 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1f430 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1f440 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  2) |.        SQL
1f450 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1f460 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1f470 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1f480 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1f490 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1f4c0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1f4d0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1f4e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f4f0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1f500 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1f510 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1f520 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1f550 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1f560 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1f570 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
1f580 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1f590 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20  pe, "qnx6") ){. 
1f5a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1f5b0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1f5c0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1f5d0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1f5e0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1f5f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f600 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20  AP_ATOMIC |     
1f610 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
1f620 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1f630 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1f640 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f650 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1f660 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1f670 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1f680 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1f6c0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1f6d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f6e0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f6f0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f700 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f710 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f740 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f750 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f760 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
1f770 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1f780 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22  basetype, "qnx4"
1f790 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f7a0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f7b0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f7c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f7d0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f7e0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1f7f0 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1f800 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1f810 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1f820 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1f830 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1f840 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1f850 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f860 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1f870 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1f880 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f890 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f8a0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f8b0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f8c0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f8f0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f900 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f910 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
1f920 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f930 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20  , "dos") ){.    
1f940 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f950 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f960 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f970 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f980 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f990 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
1f9a0 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
1f9b0 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
1f9c0 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
1f9d0 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
1f9e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1f9f0 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1fa00 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
1fa10 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
1fa20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1fa30 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1fa40 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1fa50 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1fa60 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fa90 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1faa0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1fab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fac0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1fad0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1fae0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1faf0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20  IOCAP_ATOMIC512 
1fb00 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73  |      /* blocks
1fb10 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1fb20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1fb30 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1fb40 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1fb50 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1fb60 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1fba0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1fbb0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20       0;.    }.  
1fbc0 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e  }.  /* Last chan
1fbd0 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  ce verification.
1fbe0 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20    If the sector 
1fbf0 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c  size isn't a mul
1fc00 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a  tiple of 512.  *
1fc10 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20  * then it isn't 
1fc20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70  valid.*/.  if( p
1fc30 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fc40 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20   % 512 != 0 ){. 
1fc50 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1fc60 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1fc70 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1fc80 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1fc90 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1fca0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
1fcb0 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1fcc0 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  torSize;.}.#endi
1fcd0 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  f /* __QNXNTO__ 
1fce0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
1fcf0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1fd00 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
1fd10 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
1fd20 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
1fd30 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
1fd40 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1fd50 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
1fd60 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
1fd70 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
1fd80 65 20 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69  e is contraversi
1fd90 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
1fda0 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
1fdb0 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
1fdc0 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
1fdd0 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
1fde0 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
1fdf0 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
1fe00 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
1fe10 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
1fe20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
1fe30 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
1fe40 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
1fe50 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1fe60 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
1fe70 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
1fe80 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
1fe90 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
1fea0 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
1feb0 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
1fec0 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
1fed0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
1fee0 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
1fef0 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
1ff00 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
1ff10 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
1ff20 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
1ff30 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1ff40 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
1ff50 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
1ff60 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
1ff70 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
1ff80 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
1ff90 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
1ffa0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
1ffb0 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
1ffc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
1ffd0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ffe0 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
1fff0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
20000 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
20010 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
20020 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e  = 0;.#ifdef __QN
20030 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e  XNTO__.  if( p->
20040 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20  sectorSize==0 ) 
20050 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69  unixSectorSize(i
20060 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65  d);.  rc = p->de
20070 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20080 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ics;.#endif.  if
20090 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ( p->ctrlFlags &
200a0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
200b0 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49  {.    rc |= SQLI
200c0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
200d0 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
200e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
200f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20100 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
20110 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
20120 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
20130 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
20140 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
20150 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
20160 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
20170 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
20180 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
20190 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
201a0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
201b0 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
201c0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
201d0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
201e0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
201f0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
20200 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
20210 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
20220 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
20230 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
20240 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
20250 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
20260 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
20270 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
20280 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
20290 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
202a0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
202b0 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
202c0 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
202d0 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
202e0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
202f0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
20300 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
20310 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
20320 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
20330 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
20340 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
20350 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
20360 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
20370 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
20380 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
20390 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
203a0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
203b0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
203c0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
203d0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
203e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
203f0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
20400 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
20410 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
20420 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
20430 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
20440 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
20450 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
20460 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
20470 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
20480 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
20490 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
204a0 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
204b0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
204c0 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
204d0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
204e0 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
204f0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
20500 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
20510 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
20520 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
20530 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
20540 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
20550 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
20560 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
20570 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
20580 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
20590 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
205a0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
205b0 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
205c0 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
205d0 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
205e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
205f0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
20600 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
20610 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
20620 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
20630 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
20640 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
20650 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
20680 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
20690 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
206b0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
206c0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
206d0 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206f0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
20700 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
20710 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
20720 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20730 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
20740 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
20750 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
20760 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
20770 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20780 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
20790 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
207a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
207b0 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
207c0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
207d0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
207e0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
207f0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
20800 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
20810 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
20820 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20830 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
20840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20850 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
20860 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
20870 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
20880 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20890 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
208a0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
208b0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
208d0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
208e0 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
208f0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
20900 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
20910 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
20920 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
20930 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
20940 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
20950 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
20960 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
20970 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
20980 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
20990 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
209a0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
209b0 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
209c0 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
209d0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
209e0 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
209f0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
20a00 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
20a10 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
20a20 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
20a30 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
20a40 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
20a50 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
20a60 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
20a70 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
20a80 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
20a90 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
20aa0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
20ab0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20ac0 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
20ad0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
20ae0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
20af0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
20b00 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
20b10 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b30 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
20b40 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
20b50 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
20b60 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
20b70 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
20b80 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
20b90 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
20ba0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
20bb0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
20bc0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
20bd0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
20be0 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
20bf0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
20c00 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
20c10 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
20c20 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
20c30 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
20c40 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
20c50 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
20c60 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
20c70 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
20c80 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
20c90 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
20ca0 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
20cb0 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
20cc0 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
20cd0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
20ce0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
20cf0 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
20d00 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
20d10 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
20d20 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
20d30 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
20d40 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
20d50 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
20d60 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
20d70 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
20d80 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
20d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20da0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
20db0 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
20dc0 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
20dd0 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
20de0 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
20df0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
20e00 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
20e10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
20e20 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
20e30 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
20e40 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
20e50 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
20e60 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
20e70 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
20e80 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
20e90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20ea0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
20eb0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
20ec0 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
20ed0 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
20ee0 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
20ef0 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
20f00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
20f10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
20f20 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
20f30 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
20f40 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
20f50 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
20f60 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
20f70 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
20f80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20f90 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
20fa0 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
20fb0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
20fc0 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
20fd0 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
20fe0 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
20ff0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
21000 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
21010 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
21020 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
21030 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
21040 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
21050 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
21060 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
21070 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
21080 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
21090 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
210a0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
210b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
210c0 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
210d0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
210e0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
210f0 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
21100 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
21110 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
21120 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
21130 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
21140 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
21150 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
21160 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
21170 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
21180 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
21190 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
211a0 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
211b0 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
211c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
211d0 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
211e0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
211f0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
21200 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
21210 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
21220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21230 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
21240 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
21250 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
21260 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
21270 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21280 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
21290 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
212a0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
212b0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
212c0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
212d0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
212e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
212f0 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
21300 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
21310 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
21320 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
21330 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
21340 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
21350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21360 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
21370 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
21380 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
21390 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
213a0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
213b0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
213c0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
213d0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
213e0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
213f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21400 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
21410 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
21420 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
21430 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
21440 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
21450 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
21460 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
21470 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
21480 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
21490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
214a0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
214b0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
214c0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
214d0 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
214e0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
214f0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
21500 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
21510 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
21520 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
21530 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
21540 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
21550 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
21560 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
21570 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
21580 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
21590 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
215a0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
215b0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
215c0 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
215d0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
215e0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
215f0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
21600 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
21610 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
21620 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
21630 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
21640 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
21650 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
21660 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
21670 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
21680 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
21690 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
216a0 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
216b0 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
216c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
216d0 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
216e0 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
216f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
21700 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
21710 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
21720 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
21730 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21740 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
21750 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70    osMunmap(p->ap
21760 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
21770 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
21780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21790 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
217a0 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
217b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
217c0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
217d0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
217e0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
217f0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
21800 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
21810 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
21820 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
21830 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
21840 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
21850 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
21860 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
21870 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
21880 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
21890 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
218a0 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
218b0 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
218c0 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
218d0 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
218e0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
218f0 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
21900 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
21910 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
21920 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
21930 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
21940 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
21950 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
21960 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
21970 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
21980 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
21990 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
219a0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
219b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
219c0 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
219d0 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
219e0 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
219f0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
21a00 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
21a10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
21a20 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
21a30 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
21a40 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
21a50 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
21a60 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
21a70 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
21a80 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
21a90 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
21aa0 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
21ab0 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
21ac0 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
21ad0 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
21ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21af0 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
21b00 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
21b10 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
21b20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
21b30 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
21b40 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
21b50 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
21b60 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
21b70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
21b80 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
21b90 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
21ba0 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
21bb0 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
21bc0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
21bd0 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
21be0 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
21bf0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
21c00 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
21c10 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
21c20 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
21c30 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
21c40 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
21c50 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
21c60 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
21c70 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
21c80 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
21c90 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
21ca0 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
21cb0 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
21cc0 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
21cd0 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
21ce0 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
21cf0 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
21d00 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
21d10 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
21d20 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
21d30 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
21d40 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
21d50 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
21d60 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
21d70 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
21d80 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
21d90 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
21da0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
21db0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
21dc0 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
21dd0 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
21de0 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
21df0 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
21e00 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
21e10 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
21e20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
21e30 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
21e40 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
21e50 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
21e60 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
21e70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
21e80 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
21e90 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
21ea0 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
21eb0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
21ec0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
21ed0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
21ee0 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
21ef0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
21f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
21f10 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
21f20 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
21f30 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
21f40 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
21f50 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
21f60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
21f70 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
21f80 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
21f90 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
21fa0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
21fb0 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
21fc0 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
21fd0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
21fe0 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
21ff0 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
22000 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
22010 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
22020 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
22030 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
22040 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
22050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22060 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
22070 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
22080 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
22090 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
220a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
220b0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
220c0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
220d0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
220e0 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
220f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
22100 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
22110 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22130 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
22140 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
22150 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
22160 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
22170 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
22180 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
22190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
221a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
221b0 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
221c0 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
221d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
221e0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
221f0 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
22200 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
22210 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
22220 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
22230 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
22240 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
22250 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
22260 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
22270 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22280 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
22290 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
222a0 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
222b0 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
222c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
222d0 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
222e0 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
222f0 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
22300 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
22310 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
22320 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
22330 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
22340 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
22350 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
22360 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
22370 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
22380 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
22390 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
223a0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
223b0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
223c0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
223d0 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
223e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
223f0 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
22400 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
22410 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
22420 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22430 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
22440 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
22450 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
22460 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
22470 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
22480 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
22490 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
224a0 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
224b0 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
224c0 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26  d->h, &sStat) &&
224d0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
224e0 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
224f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
22500 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
22510 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
22520 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
22530 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
22540 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
22550 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
22560 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
22570 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c  CTORY) + 31;.#el
22580 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
22590 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73  ame = 6 + (int)s
225a0 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61  trlen(pDbFd->zPa
225b0 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
225c0 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
225d0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
225e0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
225f0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ShmFilename );. 
22600 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d     if( pShmNode=
22610 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
22620 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
22630 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
22640 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
22650 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
22660 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
22670 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65  hmNode)+nShmFile
22680 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46  name);.    zShmF
22690 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f  ilename = pShmNo
226a0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  de->zFilename = 
226b0 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65  (char*)&pShmNode
226c0 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
226d0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
226e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
226f0 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
22700 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
22710 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
22720 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
22730 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73  HM_DIRECTORY "/s
22740 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22  qlite-shm-%x-%x"
22750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22760 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61         (u32)sSta
22770 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73  t.st_ino, (u32)s
22780 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65  Stat.st_dev);.#e
22790 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lse.    sqlite3_
227a0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
227b0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
227c0 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70  ame, "%s-shm", p
227d0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
227e0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
227f0 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
22800 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  h, zShmFilename)
22810 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
22820 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
22830 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
22840 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
22850 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
22860 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
22870 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
22880 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
22890 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
228a0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
228b0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
228c0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
228d0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
228e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
228f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
22900 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
22910 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
22920 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
22930 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
22940 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
22950 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20  R | O_CREAT;.   
22960 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
22970 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64  ri_boolean(pDbFd
22980 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
22990 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20  ly_shm", 0) ){. 
229a0 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
229b0 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
229c0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
229d0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
229e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
229f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
22a00 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
22a10 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
22a20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
22a30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
22a40 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
22a50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
22a60 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
22a70 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
22a80 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69  , "open", zShmFi
22a90 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
22aa0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
22ab0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rr;.      }..   
22ac0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
22ad0 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
22ae0 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73   as root, make s
22af0 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d  ure that the SHM
22b00 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69   file.      ** i
22b10 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73  s owned by the s
22b20 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77  ame user that ow
22b30 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ns the original 
22b40 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72  database.  Other
22b50 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  wise,.      ** t
22b60 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65  he original owne
22b70 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  r will not be ab
22b80 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20  le to connect.. 
22b90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f 73       */.      os
22ba0 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d  Fchown(pShmNode-
22bb0 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64  >h, sStat.st_uid
22bc0 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b  , sStat.st_gid);
22bd0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  .  .      /* Che
22be0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
22bf0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
22c00 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
22c10 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
22c20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
22c30 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
22c40 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
22c50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22c70 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68        if( unixSh
22c80 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
22c90 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  Node, F_WRLCK, U
22ca0 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
22cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22cc0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
22cd0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
22ce0 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
22cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
22d00 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
22d10 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
22d20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
22d30 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
22d40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22d50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22d70 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
22d80 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
22d90 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f  , F_RDLCK, UNIX_
22da0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
22db0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
22dc0 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65  c ) goto shm_ope
22dd0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  n_err;.    }.  }
22de0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
22df0 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
22e00 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e   child of the un
22e10 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  ixShmNode */.  p
22e20 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
22e30 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
22e40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
22e50 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
22e60 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
22e70 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
22e80 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
22e90 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78  pShm = p;.  unix
22ea0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
22eb0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
22ec0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
22ed0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
22ee0 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
22ef0 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
22f00 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69  cover of the uni
22f10 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  xEnterMutex() mu
22f20 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
22f30 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
22f40 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e  * new (struct un
22f50 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  ixShm) object to
22f60 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
22f70 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
22f80 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
22f90 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
22fa0 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
22fb0 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
22fc0 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
22fd0 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
22fe0 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
22ff0 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
23000 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
23010 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
23020 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
23030 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23040 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
23050 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
23060 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
23070 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
23080 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
23090 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
230a0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
230b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
230c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
230d0 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
230e0 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
230f0 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53  pen_err:.  unixS
23100 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20  hmPurge(pDbFd); 
23110 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
23120 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
23130 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
23140 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
23150 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  p);.  unixLeaveM
23160 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
23170 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23180 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23190 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
231a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
231b0 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
231c0 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
231d0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
231e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
231f0 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
23200 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
23210 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
23220 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
23230 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
23240 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
23250 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
23260 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
23270 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
23280 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
23290 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
232a0 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
232b0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
232c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
232d0 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d  he bExtend param
232e0 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
232f0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
23300 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
23310 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
23320 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
23330 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
23340 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
23350 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
23360 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
23370 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
23380 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
23390 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
233a0 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f  ** bExtend is no
233b0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
233c0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
233d0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
233e0 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
233f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
23400 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
23410 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
23420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
23430 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
23440 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
23450 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
23460 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
23470 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
23480 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
23490 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
234a0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
234b0 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
234c0 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
234d0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
234e0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
234f0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
23500 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
23510 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
23520 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23530 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a  int unixShmMap(.
23540 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
23550 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
23560 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
23570 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
23580 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
23590 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
235a0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
235b0 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
235c0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
235f0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45  ions */.  int bE
23600 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20  xtend,          
23610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23620 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
23630 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
23640 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
23650 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
23660 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
23670 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
23680 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
23690 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
236a0 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a  ;.  unixShm *p;.
236b0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
236c0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
236d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
236e0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72    /* If the shar
236f0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68  ed-memory file h
23700 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
23710 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
23720 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44  now. */.  if( pD
23730 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a  bFd->pShm==0 ){.
23740 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65      rc = unixOpe
23750 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
23760 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
23770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
23780 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
23790 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
237a0 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
237b0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c  >pShmNode;.  sql
237c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
237d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
237e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
237f0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
23800 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
23810 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
23820 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
23830 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
23840 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
23850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23860 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
23870 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
23880 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
23890 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
238a0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
238b0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
238c0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
238d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
238e0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
238f0 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
23900 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
23910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
23920 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
23930 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
23940 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
23950 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
23960 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
23970 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
23980 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
23990 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
239a0 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
239b0 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
239c0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
239d0 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
239e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
239f0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  h>=0 ){.      /*
23a00 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
23a10 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
23a20 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
23a30 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
23a40 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20  space..      ** 
23a50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23a60 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
23a70 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
23a80 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
23a90 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61  e is.      ** la
23aa0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
23ab0 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
23ac0 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
23ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23ae0 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65  osFstat(pShmNode
23af0 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
23b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23b10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
23b20 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  E;.        goto 
23b30 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
23b40 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
23b50 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c  ( sStat.st_size<
23b60 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
23b70 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
23b80 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
23b90 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
23ba0 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65  If bExtend is se
23bb0 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
23bc0 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c  false, exit earl
23bd0 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
23be0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
23bf0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23c00 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
23c10 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65        if( !bExte
23c20 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
23c30 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
23c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
23c50 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
23c60 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e  ively, if bExten
23c70 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e  d is true, exten
23c80 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74  d the file. Do t
23c90 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a  his by.        *
23ca0 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67  * writing a sing
23cb0 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65  le byte to the e
23cc0 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20  nd of each (OS) 
23cd0 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20  page being.     
23ce0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
23cf0 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63  or extended. Tec
23d00 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65  hnically, we nee
23d10 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20  d only write to 
23d20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  the.        ** l
23d30 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65  ast page in orde
23d40 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  r to extend the 
23d50 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e  file. But writin
23d60 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20  g to all new.   
23d70 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f       ** pages fo
23d80 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61  rces the OS to a
23d90 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d  llocate them imm
23da0 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20  ediately, which 
23db0 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20  reduces.        
23dc0 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f  ** the chances o
23dd0 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61  f SIGBUS while a
23de0 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70  ccessing the map
23df0 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72  ped region later
23e00 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a   on..        */.
23e10 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20          else{.  
23e20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
23e30 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
23e40 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20  4096;.          
23e50 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20  int iPg;..      
23e60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
23e70 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
23e80 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f   each newly allo
23e90 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
23ea0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
23eb0 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79      assert( (nBy
23ec0 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b  te % pgsz)==0 );
23ed0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
23ee0 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a  Pg=(sStat.st_siz
23ef0 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42  e/pgsz); iPg<(nB
23f00 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b  yte/pgsz); iPg++
23f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23f20 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  f( seekAndWriteF
23f30 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69  d(pShmNode->h, i
23f40 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31  Pg*pgsz + pgsz-1
23f50 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29  , "", 1, 0)!=1 )
23f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23f70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23f80 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
23f90 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ilename;.       
23fa0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
23fb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
23fc0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
23fd0 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a  write", zFile);.
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
23ff0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
24000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
24010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24020 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24030 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
24040 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
24050 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
24060 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
24070 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
24080 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61      apNew = (cha
24090 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  r **)sqlite3_rea
240a0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
240b0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
240c0 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
240d0 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
240e0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
240f0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
24100 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
24110 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
24120 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
24130 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
24140 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  >apRegion = apNe
24150 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 70 53 68  w;.    while(pSh
24160 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
24170 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20 20 20 20  iRegion){.      
24180 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
24190 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
241a0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
241b0 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMem = osMmap(0,
241c0 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20   szRegion,.     
241d0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
241e0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
241f0 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
24200 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
24210 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
24220 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
24230 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28  e->h, szRegion*(
24240 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  i64)pShmNode->nR
24250 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
24260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
24270 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
24280 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24290 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
242a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
242b0 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
242c0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
242d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
242e0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
242f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
24300 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
24310 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
24320 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
24330 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
24340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24350 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
24360 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
24370 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
24390 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
243a0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
243b0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
243c0 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  >apRegion[pShmNo
243d0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20 70  de->nRegion] = p
243e0 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Mem;.      pShmN
243f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
24400 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
24410 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
24420 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
24430 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a  iRegion ){.    *
24440 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  pp = pShmNode->a
24450 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  pRegion[iRegion]
24460 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
24470 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  pp = 0;.  }.  if
24480 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
24490 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51  adonly && rc==SQ
244a0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
244b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
244c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
244d0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
244e0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
244f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
24500 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
24510 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
24520 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
24530 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
24540 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
24550 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
24560 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
24570 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
24580 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
24590 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
245a0 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
245b0 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
245c0 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
245d0 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
245e0 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
245f0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
24600 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
24610 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
24620 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
24630 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
24640 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
24650 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
24660 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
24670 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
24680 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
24690 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
246a0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
246b0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
246c0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
246d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
246e0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
246f0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
24700 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24720 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
24730 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
24740 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
24750 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
24760 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
24770 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
24780 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
24790 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
247a0 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
247b0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
247c0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
247d0 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
247e0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
247f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
24800 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
24810 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
24820 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
24830 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
24840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24850 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
24860 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
24870 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
24880 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
24890 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
248a0 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
248b0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
248c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
248f0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
24900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
24920 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
24930 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
24940 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
24950 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
24960 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
24970 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24980 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
24990 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
249a0 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
249b0 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
249c0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
249d0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
249e0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
249f0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
24a00 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
24a10 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
24a20 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
24a30 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
24a40 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
24a50 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
24a60 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
24a70 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
24a80 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
24a90 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
24aa0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
24ab0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
24ac0 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
24ad0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
24ae0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
24af0 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
24b00 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24b10 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
24b20 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
24b30 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
24b40 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
24b50 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
24b60 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
24b70 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
24b80 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
24b90 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
24ba0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
24bb0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
24bc0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
24bd0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
24be0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
24bf0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
24c00 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
24c10 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
24c20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
24c30 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
24c40 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
24c50 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
24c60 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
24c70 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
24c80 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
24c90 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
24ca0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
24cb0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
24cc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
24cd0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
24ce0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
24cf0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
24d00 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
24d10 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
24d20 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
24d30 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
24d40 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
24d50 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
24d60 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
24d70 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
24d80 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
24d90 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
24da0 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
24db0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
24dc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24de0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
24df0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
24e00 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
24e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24e20 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
24e30 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
24e40 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
24e50 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
24e60 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
24e70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
24e80 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
24e90 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
24ea0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
24eb0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
24ec0 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
24ed0 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
24ee0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
24ef0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
24f00 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
24f10 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
24f20 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
24f30 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
24f40 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
24f50 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
24f60 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
24f70 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
24f80 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
24f90 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
24fa0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
24fb0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
24fc0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
24fd0 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
24fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
25000 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25010 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
25020 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
25030 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
25040 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
25050 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
25060 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
25070 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
25080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25090 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
250a0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
250b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
250c0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
250d0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
250e0 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_RDLCK, ofst+U
250f0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
25100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25110 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25120 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
25130 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
25140 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
25150 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
25160 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25170 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
25180 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
25190 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
251a0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
251b0 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
251c0 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
251d0 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
251e0 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
251f0 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
25200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
25210 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
25220 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
25230 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
25240 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
25250 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25260 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
25270 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
25280 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
25290 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
252a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
252b0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
252c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
252d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
252e0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
252f0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
25300 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
25310 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
25320 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
25330 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
25340 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
25350 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
25360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25370 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   ){.      rc = u
25380 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
25390 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c  (pShmNode, F_WRL
253a0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
253b0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
253c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
253d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
253e0 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
253f0 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
25400 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
25410 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
25420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25430 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
25440 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
25450 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
25460 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
25470 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
25480 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
25490 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
254a0 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70  >id, getpid(), p
254b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
254c0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72  >exclMask));.  r
254d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
254e0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
254f0 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
25500 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
25510 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
25520 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
25530 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
25540 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
25550 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
25560 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
25570 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
25580 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
25590 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
255a0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42  ic void unixShmB
255b0 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65  arrier(.  sqlite
255c0 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20  3_file *fd      
255d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
255e0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
255f0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
25600 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
25610 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
25620 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
25630 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61  tex();.  unixLea
25640 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
25650 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
25660 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
25670 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
25680 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
25690 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
256a0 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
256b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
256c0 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
256d0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
256e0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
256f0 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
25700 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
25710 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
25720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
25730 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
25740 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25760 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
25770 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25780 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
257b0 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
257c0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
257d0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
257e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
257f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
25800 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
25810 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25820 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
25830 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25840 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
25850 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
25860 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
25870 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25880 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
25890 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
258a0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
258b0 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
258c0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
258d0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
258e0 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
258f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25900 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
25910 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
25920 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25930 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
25940 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
25950 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25960 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
25970 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
25980 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25990 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
259a0 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
259b0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
259c0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
259d0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
259e0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
259f0 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
25a00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
25a10 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
25a20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
25a30 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
25a40 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
25a50 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
25a60 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
25a70 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
25a80 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
25a90 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
25aa0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
25ab0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
25ac0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
25ad0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
25ae0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
25af0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
25b00 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
25b10 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
25b20 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
25b30 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
25b40 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
25b50 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
25b60 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
25b70 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
25b80 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
25b90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
25ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
25bb0 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
25bc0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f 73  mNode->h>=0 ) os
25bd0 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
25be0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
25bf0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
25c00 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  bFd);.  }.  unix
25c10 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
25c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25c30 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64  K;.}...#else.# d
25c40 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70  efine unixShmMap
25c50 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20       0.# define 
25c60 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30  unixShmLock    0
25c70 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
25c80 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
25c90 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  ine unixShmUnmap
25ca0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
25cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25cc0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
25cd0 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
25ce0 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
25cf0 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
25d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
25d10 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
25d20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
25d30 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
25d40 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
25d50 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
25d60 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
25d70 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
25d80 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  ){.    osMunmap(
25d90 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  pFd->pMapRegion,
25da0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
25db0 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e  tual);.    pFd->
25dc0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
25dd0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
25de0 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e  e = 0;.    pFd->
25df0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
25e00 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
25e10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
25e20 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
25e30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79  ** Return the sy
25e40 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a  stem page size..
25e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
25e60 69 78 47 65 74 50 61 67 65 73 69 7a 65 28 76 6f  ixGetPagesize(vo
25e70 69 64 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52  id){.#if HAVE_MR
25e80 45 4d 41 50 0a 20 20 72 65 74 75 72 6e 20 35 31  EMAP.  return 51
25e90 32 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  2;.#elif defined
25ea0 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
25eb0 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
25ec0 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
25ed0 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
25ee0 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
25ef0 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
25f00 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
25f10 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23  MAP_SIZE>0 */..#
25f20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
25f30 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
25f40 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
25f50 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
25f60 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
25f70 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65  intained by file
25f80 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20   .** descriptor 
25f90 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65  pFd to nNew byte
25fa0 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20  s. Any existing 
25fb0 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61  mapping is disca
25fc0 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  rded..**.** If s
25fd0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
25fe0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
25ff0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
26000 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ables:.**.**    
26010 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70     unixFile.pMap
26020 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  Region.**       
26030 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
26040 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  e.**       unixF
26050 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75  ile.mmapSizeActu
26060 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75  al.**.** If unsu
26070 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72  ccessful, an err
26080 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f  or message is lo
26090 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  gged via sqlite3
260a0 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68  _log() and.** th
260b0 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65  e three variable
260c0 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f  s above are zero
260d0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
260e0 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a   SQLite should.*
260f0 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73  * continue acces
26100 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
26110 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61  e using the xRea
26120 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29  d() and xWrite()
26130 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  .** methods..*/.
26140 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
26150 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69  Remapfile(.  uni
26160 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20  xFile *pFd,     
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26180 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
26190 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
261a0 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20  nNew            
261b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
261c0 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20  equired mapping 
261d0 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  size */.){.  con
261e0 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
261f0 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20  "mmap";.  int h 
26200 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20  = pFd->h;       
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26220 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
26230 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c  r open on db fil
26240 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67  e */.  u8 *pOrig
26250 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d   = (u8 *)pFd->pM
26260 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50  apRegion;   /* P
26270 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
26280 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a  t file mapping *
26290 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20  /.  i64 nOrig = 
262a0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
262b0 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  ual;     /* Size
262c0 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e   of pOrig region
262d0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
262e0 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  8 *pNew = 0;    
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
26310 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a  of new mapping *
26320 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  /.  int flags = 
26330 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20  PROT_READ;      
26340 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
26350 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61  s to pass to mma
26360 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  p() */..  assert
26370 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
26380 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26390 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53   nNew>pFd->mmapS
263a0 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
263b0 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70   nNew<=pFd->mmap
263c0 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73  SizeMax );.  ass
263d0 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
263e0 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d   assert( pFd->mm
263f0 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46  apSizeActual>=pF
26400 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20  d->mmapSize );. 
26410 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49   assert( MAP_FAI
26420 4c 45 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28  LED!=0 );..  if(
26430 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
26440 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e   & UNIXFILE_RDON
26450 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c  LY)==0 ) flags |
26460 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20  = PROT_WRITE;.. 
26470 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 20 20   if( pOrig ){.  
26480 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79    const int szSy
26490 73 70 61 67 65 20 3d 20 75 6e 69 78 47 65 74 50  spage = unixGetP
264a0 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69  agesize();.    i
264b0 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64  64 nReuse = (pFd
264c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73  ->mmapSize & ~(s
264d0 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 20 20  zSyspage-1));.  
264e0 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f    u8 *pReq = &pO
264f0 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20  rig[nReuse];..  
26500 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70    /* Unmap any p
26510 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73  ages of the exis
26520 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61  ting mapping tha
26530 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73  t cannot be reus
26540 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ed. */.    if( n
26550 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a  Reuse!=nOrig ){.
26560 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
26570 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73  Req, nOrig-nReus
26580 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48  e);.    }..#if H
26590 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70  AVE_MREMAP.    p
265a0 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70  New = osMremap(p
265b0 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e  Orig, nReuse, nN
265c0 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f  ew, MREMAP_MAYMO
265d0 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  VE);.    zErr = 
265e0 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a  "mremap";.#else.
265f0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
26600 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65  p(pReq, nNew-nRe
26610 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  use, flags, MAP_
26620 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73  SHARED, h, nReus
26630 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
26640 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  !=MAP_FAILED ){.
26650 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d        if( pNew!=
26660 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  pReq ){.        
26670 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e  osMunmap(pNew, n
26680 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20  New - nReuse);. 
26690 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
266a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
266b0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72        pNew = pOr
266c0 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
266d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
266e0 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   The attempt to 
266f0 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74  extend the exist
26700 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c  ing mapping fail
26710 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a  ed. Free it. */.
26720 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41      if( pNew==MA
26730 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77  P_FAILED || pNew
26740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  ==0 ){.      osM
26750 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  unmap(pOrig, nRe
26760 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  use);.    }.  }.
26770 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73  .  /* If pNew is
26780 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79   still NULL, try
26790 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e   to create an en
267a0 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69  tirely new mappi
267b0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  ng. */.  if( pNe
267c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  w==0 ){.    pNew
267d0 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65   = osMmap(0, nNe
267e0 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  w, flags, MAP_SH
267f0 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d  ARED, h, 0);.  }
26800 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41  ..  if( pNew==MA
26810 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
26820 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e  pNew = 0;.    nN
26830 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78  ew = 0;.    unix
26840 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26850 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a  OK, zErr, pFd->z
26860 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Path);..    /* I
26870 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f  f the mmap() abo
26880 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  ve failed, assum
26890 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65  e that all subse
268a0 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c  quent mmap() cal
268b0 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70  ls.    ** will p
268c0 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f  robably fail too
268d0 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75  . Fall back to u
268e0 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
268f0 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20  e exclusively.  
26900 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
26910 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e  e.  */.    pFd->
26920 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b  mmapSizeMax = 0;
26930 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70  .  }.  pFd->pMap
26940 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a  Region = (void *
26950 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d  )pNew;.  pFd->mm
26960 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d  apSize = pFd->mm
26970 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e  apSizeActual = n
26980 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  New;.}.#endif../
26990 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
269a0 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
269b0 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
269c0 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
269d0 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
269e0 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
269f0 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
26a00 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
26a10 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
26a20 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72   Or, if .** ther
26a30 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
26a40 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74   a mapping for t
26a50 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  his file, and th
26a60 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a  ere are still .*
26a70 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46  * outstanding xF
26a80 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65  etch() reference
26a90 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75  s to it, this fu
26aa0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26ab0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  p..**.** If para
26ac0 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e  meter nByte is n
26ad0 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65  on-negative, the
26ae0 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75  n it is the requ
26af0 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a  ested size of .*
26b00 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f  * the mapping to
26b10 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69   create. Otherwi
26b20 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20  se, if nByte is 
26b30 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
26b40 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71  then the .** req
26b50 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
26b60 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
26b70 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
26b80 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
26b90 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
26ba0 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
26bb0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
26bc0 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
26bd0 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20   configured .** 
26be0 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e  using SQLITE_FCN
26bf0 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77  TL_MMAP_LIMIT, w
26c00 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
26c10 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
26c20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26c30 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
26c40 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
26c50 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
26c60 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
26c70 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
26c80 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
26c90 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
26ca0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
26cb0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
26cc0 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
26cd0 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
26ce0 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 23  d, i64 nByte){.#
26cf0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
26d00 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 36 34 20  AP_SIZE>0.  i64 
26d10 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20  nMap = nByte;.  
26d20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
26d30 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
26d40 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
26d50 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
26d60 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
26d70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
26d80 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
26d90 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
26da0 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
26db0 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
26dc0 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
26dd0 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  /.    rc = osFst
26de0 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74  at(pFd->h, &stat
26df0 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
26e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26e10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26e20 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
26e30 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d      }.    nMap =
26e40 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
26e50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
26e60 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  >pFd->mmapSizeMa
26e70 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20  x ){.    nMap = 
26e80 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
26e90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61  ;.  }..  if( nMa
26ea0 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  p!=pFd->mmapSize
26eb0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70   ){.    if( nMap
26ec0 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
26ed0 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e  Remapfile(pFd, n
26ee0 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Map);.    }else{
26ef0 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70  .      unixUnmap
26f00 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d  file(pFd);.    }
26f10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
26f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  .}../*.** If pos
26f40 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
26f50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
26f60 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
26f70 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
26f80 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
26f90 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
26fa0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
26fb0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
26fc0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
26fd0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
26fe0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
26ff0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
27000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
27010 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
27020 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
27030 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
27040 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
27050 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
27060 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
27070 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
27080 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27090 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
270a0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
270b0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
270c0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
270d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
270e0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
270f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
27100 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
27110 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
27120 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
27130 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
27140 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
27150 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27160 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
27170 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27180 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
27190 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
271a0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
271b0 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
271c0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
271d0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
271e0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
271f0 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
27200 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
27210 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27220 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
27230 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
27240 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
27250 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
27260 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
27270 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
27280 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
27290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
272a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
272b0 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
272c0 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
272d0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
272e0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
272f0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27300 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
27310 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
27320 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
27330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27350 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
27360 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
27370 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27380 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
27390 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
273a0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
273b0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
273c0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
273d0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
273e0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
273f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
27400 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
27410 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
27420 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
27430 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
27440 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
27450 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
27460 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
27470 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
27480 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27490 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
274a0 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
274b0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
274c0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
274d0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
274e0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
274f0 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
27500 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
27510 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
27520 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
27530 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
27540 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27550 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 75 6e  , void *p){.  un
27560 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
27570 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
27580 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
27590 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
275a0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
275b0 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
275c0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
275d0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
275e0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
275f0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
27600 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
27610 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
27620 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
27630 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
27640 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
27650 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
27660 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
27670 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
27680 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
27690 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
276a0 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
276b0 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
276c0 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
276d0 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
276e0 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
276f0 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
27700 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
27710 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
27720 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
27730 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
27740 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
27750 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
27760 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
27770 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 72 65  chOut>=0 );.  re
27780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27790 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
277a0 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
277b0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
277c0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
277d0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
277e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
277f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
27800 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
27810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27820 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
27830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27870 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
27880 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
27890 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
278a0 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
278b0 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
278c0 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
278d0 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
278e0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
278f0 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
27900 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
27910 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
27920 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
27930 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
27940 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
27950 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
27960 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27970 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
27980 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
27990 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
279a0 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
279b0 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
279c0 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
279d0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
279e0 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
279f0 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
27a00 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
27a10 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
27a20 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
27a30 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
27a40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27a50 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
27a60 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
27a70 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
27a80 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
27a90 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
27aa0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
27ab0 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
27ac0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
27ad0 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
27ae0 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
27af0 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
27b00 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
27b10 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
27b20 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77  er-funtion F, tw
27b30 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
27b40 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
27b50 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
27b60 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
27b70 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
27b80 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
27b90 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
27ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
27bb0 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
27bc0 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
27bd0 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
27be0 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
27bf0 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
27c00 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
27c10 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
27c20 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
27c30 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
27c40 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
27c50 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
27c60 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
27c70 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
27c80 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
27c90 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
27ca0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
27cb0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
27cc0 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
27cd0 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
27ce0 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
27cf0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
27d00 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
27d10 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27d20 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
27d30 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
27d40 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
27d50 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
27d60 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
27d70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
27d80 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
27d90 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
27da0 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
27db0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
27dc0 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
27dd0 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
27de0 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
27df0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
27e00 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20  METHODS(FINDER, 
27e10 4d 45 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c  METHOD, VERSION,
27e20 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
27e30 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
27e40 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
27e50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
27e60 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27eb0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
27ec0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ee0 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f50 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
27f80 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27fd0 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ff0 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28020 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28040 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28070 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28090 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
280c0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
280d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
280e0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
280f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28100 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
28110 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
28120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28130 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
28160 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
28170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
28180 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28190 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
281a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
281b0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
281c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
281d0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
281e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281f0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28200 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
28210 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
28220 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
28250 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
28260 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
28270 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
282a0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
282b0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
282c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
282f0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28300 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
28310 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
28340 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
28350 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
28360 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e    \.   unixShmUn
28390 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
283a0 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
283b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c   \.   unixFetch,
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20    /* xFetch */  
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68  \.   unixUnfetch
28430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28440 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20   /* xUnfetch */ 
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28470 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
284c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
284d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
284e0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
284f0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
28500 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
28510 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28520 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
28530 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28560 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
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 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
28600 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
28610 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
28620 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
28630 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
28640 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
28650 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
28660 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
28670 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
28680 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28690 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
286a0 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
286b0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
286c0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
286d0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
286e0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
286f0 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
28700 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
28710 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
28720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28730 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
28740 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
28750 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
28760 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
28770 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
28780 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
287b0 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72  mory and mmap ar
287c0 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  e enabled */.  u
287d0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
287e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
287f0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
28800 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
28810 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
28820 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
28830 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
28840 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
28850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
28860 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
28870 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65  Lock     /* xChe
28880 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
28890 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54  ethod */.).IOMET
288a0 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  HODS(.  nolockIo
288b0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
288c0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
288d0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
288e0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  olockIoMethods, 
288f0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
28900 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28910 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
28920 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
28930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
28940 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
28950 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  sabled */.  nolo
28960 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
28970 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
28980 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
28990 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
289a0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
289b0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
289c0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
289d0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
289e0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
289f0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
28a00 6f 63 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ock   /* xCheckR
28a10 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
28a20 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
28a30 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
28a40 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
28a50 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
28a60 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
28a70 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
28a80 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
28a90 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28aa0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
28ad0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
28ae0 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
28af0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28b00 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
28b10 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
28b20 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28b30 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
28b40 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
28b50 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
28b60 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
28b70 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
28b80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28b90 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k  /* xCheckRese
28ba0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
28bb0 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  */.)..#if SQLITE
28bc0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
28bd0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
28be0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
28bf0 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
28c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28c10 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
28c20 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
28c30 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
28c40 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
28c50 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
28c60 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
28c90 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
28ca0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
28cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28cc0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
28cd0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
28d00 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
28d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28d20 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
28d30 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
28d40 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
28d50 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
28d60 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
28d70 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
28d80 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
28d90 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
28da0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
28db0 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
28dc0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
28dd0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
28de0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
28df0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28e00 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
28e30 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
28e40 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f  bled */.  semClo
28e50 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
28e60 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
28e70 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63  thod */.  semLoc
28e80 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28e90 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
28ea0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f  hod */.  semUnlo
28eb0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28ec0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
28ed0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65  thod */.  semChe
28ee0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
28ef0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
28f00 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
28f10 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
28f20 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
28f30 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
28f40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28f50 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
28f60 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
28f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28f80 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28f90 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
28fa0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
28fb0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
28fc0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
28fd0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
29000 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
29010 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29030 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
29040 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29060 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
29070 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29090 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
290a0 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
290b0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
290c0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
290d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
290e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
290f0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
29100 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
29110 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
29120 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
29130 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
29140 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
29150 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
29160 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
29170 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
29180 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
29190 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
291a0 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
291b0 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
291c0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
291d0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
291e0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
291f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
29200 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
29210 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
29220 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
29230 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
29240 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
29250 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
29260 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
29270 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
29280 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
29290 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
292a0 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
292b0 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
292c0 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
292d0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
292e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
292f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29300 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
29310 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
29320 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
29330 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
29340 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
29350 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
29360 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
29370 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
29380 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
29390 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
293a0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
293b0 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
293c0 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
293d0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
293e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
293f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29400 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
29410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29420 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29430 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29440 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29460 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29470 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f  isabled */.  pro
29480 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  xyClose,        
29490 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
294a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
294b0 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  xyLock,         
294c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
294d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
294e0 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  yUnlock,        
294f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29500 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
29510 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
29520 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock    /* xCheck
29530 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29540 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29550 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
29560 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
29570 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
29580 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
29590 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
295a0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
295b0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
295c0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
295d0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
295e0 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29600 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29610 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
29620 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29630 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29640 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29650 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29680 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29690 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
296a0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
296b0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
296c0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
296d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
296e0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
296f0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
29700 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29710 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29720 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29730 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29740 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck      /* xChec
29750 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29760 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29770 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
29780 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
29790 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
297a0 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
297b0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
297c0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
297d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
297e0 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
297f0 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
29800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29810 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
29820 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
29830 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29840 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
29850 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
29860 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
29870 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
29880 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
29890 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
298a0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
298b0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
298c0 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
298d0 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
298e0 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
298f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29900 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
29910 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
29920 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
29930 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
29940 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
29950 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
29960 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
29970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
29980 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
29990 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
299a0 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
299b0 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
299c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
299d0 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
299e0 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
299f0 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
29a00 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
29a10 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
29a20 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
29a30 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
29a40 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
29a50 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
29a60 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
29a70 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
29a80 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
29a90 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
29aa0 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
29ab0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
29ac0 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
29ad0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
29ae0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
29af0 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
29b00 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
29b10 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
29b20 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
29b30 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
29b40 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
29b50 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
29b60 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
29b70 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
29b80 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
29b90 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
29ba0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
29bb0 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
29bc0 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
29bd0 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
29be0 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
29bf0 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
29c00 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
29c10 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
29c20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
29c30 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
29c40 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
29c50 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
29c60 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
29c70 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
29c80 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
29c90 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
29ca0 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
29cb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
29cc0 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
29cd0 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
29ce0 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
29cf0 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
29d00 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
29d10 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
29d20 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
29d30 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
29d40 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
29d50 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
29d60 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
29d70 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
29d80 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
29d90 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
29da0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
29db0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
29dc0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
29dd0 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
29de0 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
29df0 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
29e00 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
29e10 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
29e20 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
29e30 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
29e40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29e50 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
29e60 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
29e70 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
29e80 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
29e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
29ea0 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
29eb0 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
29ec0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
29ed0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
29ee0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
29ef0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
29f00 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
29f10 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
29f20 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
29f30 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
29f40 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29f50 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29f60 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
29f70 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
29f80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29f90 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
29fa0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
29fb0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
29fc0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
29fd0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
29fe0 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
29ff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a000 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2a010 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2a020 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2a030 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2a040 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2a050 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2a060 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2a070 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
2a080 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a090 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a0a0 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
2a0b0 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2a0c0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2a0d0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2a0e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a0f0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2a100 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2a110 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2a120 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2a130 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2a140 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2a150 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2a160 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2a170 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2a180 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a190 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2a1a0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2a1b0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a1c0 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2a1d0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a1e0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2a1f0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2a200 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2a210 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2a220 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2a230 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2a240 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2a250 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2a260 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2a270 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2a280 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2a290 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2a2a0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2a2b0 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2a2c0 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2a2d0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2a2e0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2a2f0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2a300 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2a310 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2a320 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2a330 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2a340 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2a350 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a360 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2a370 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2a380 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2a390 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2a3a0 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2a3b0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2a3c0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
2a3d0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2a3e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
2a3f0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
2a400 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
2a410 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d  ointer to a IO m
2a420 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2a430 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2a440 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2a450 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2a460 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2a470 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2a480 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2a4f0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2a500 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2a530 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2a540 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2a550 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2a560 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2a570 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2a580 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2a590 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2a5a0 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2a5b0 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2a5c0 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2a5d0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2a5e0 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2a5f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2a600 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2a610 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2a620 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2a630 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2a640 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2a650 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2a660 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2a670 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2a680 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2a690 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2a6a0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2a6b0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2a6c0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2a6d0 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2a6e0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2a6f0 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
2a700 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
2a710 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
2a720 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
2a730 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a740 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
2a750 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
2a760 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
2a770 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
2a780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a790 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
2a7a0 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
2a7b0 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
2a7c0 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
2a7d0 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
2a7e0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2a7f0 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
2a800 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
2a810 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
2a820 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
2a830 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
2a840 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
2a850 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
2a860 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
2a870 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2a880 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2a890 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a8a0 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
2a8b0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
2a8c0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
2a8d0 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
2a8e0 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
2a8f0 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
2a900 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
2a910 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2a920 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2a930 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
2a940 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
2a950 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
2a960 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
2a970 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
2a980 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74  lename!=0 || (ct
2a990 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2a9a0 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b  LE_NOLOCK)!=0 );
2a9b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
2a9c0 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
2a9d0 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
2a9e0 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
2a9f0 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20  .  pNew->pVfs = 
2aa00 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  pVfs;.  pNew->zP
2aa10 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
2aa20 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61  .  pNew->ctrlFla
2aa30 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61  gs = (u8)ctrlFla
2aa40 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70  gs;.  pNew->mmap
2aa50 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
2aa60 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
2aa70 4d 6d 61 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  Mmap;.  if( sqli
2aa80 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2aa90 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ((ctrlFlags & UN
2aaa0 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46  IXFILE_URI) ? zF
2aab0 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20  ilename : 0),.  
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aad0 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c           "psow",
2aae0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
2aaf0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
2ab00 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2ab10 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2ab20 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  PSOW;.  }.  if( 
2ab30 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61  strcmp(pVfs->zNa
2ab40 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d  me,"unix-excl")=
2ab50 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
2ab60 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2ab70 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a  XFILE_EXCL;.  }.
2ab80 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2ab90 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78    pNew->pId = vx
2aba0 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
2abb0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2abc0 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29  ( pNew->pId==0 )
2abd0 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20  {.    ctrlFlags 
2abe0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
2abf0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  CK;.    rc = SQL
2ac00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
2ac10 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72  endif..  if( ctr
2ac20 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2ac30 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  E_NOLOCK ){.    
2ac40 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20  pLockingStyle = 
2ac50 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2ac60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2ac70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28  LockingStyle = (
2ac80 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29  **(finder_type*)
2ac90 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28  pVfs->pAppData)(
2aca0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29  zFilename, pNew)
2acb0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2acc0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2acd0 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a  E.    /* Cache z
2ace0 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20  Filename in the 
2acf0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
2ad00 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b  (AFP and dotlock
2ad10 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20   override) for. 
2ad20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20     ** proxyLock 
2ad30 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f  activation is po
2ad40 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70  ssible (remote p
2ad50 72 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e  roxy is based on
2ad60 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a   db name).    **
2ad70 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69   zFilename remai
2ad80 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66  ns valid until f
2ad90 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ile is closed, t
2ada0 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20  o support */.   
2adb0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2adc0 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a  ntext = (void*)z
2add0 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66  Filename;.#endif
2ade0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63  .  }..  if( pLoc
2adf0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f  kingStyle == &po
2ae00 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66  sixIoMethods.#if
2ae10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2ae20 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2ae30 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2ae40 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69  LE.    || pLocki
2ae50 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49  ngStyle == &nfsI
2ae60 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a  oMethods.#endif.
2ae70 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
2ae80 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
2ae90 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
2aea0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
2aeb0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
2aec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2aed0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
2aee0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2aef0 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
2af00 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
2af10 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
2af20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
2af30 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
2af40 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
2af50 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
2af60 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
2af70 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
2af80 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
2af90 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
2afa0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
2afb0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
2afc0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
2afd0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
2afe0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
2aff0 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
2b000 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
2b010 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
2b020 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
2b030 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2b040 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2b050 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2b060 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
2b070 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
2b080 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
2b090 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
2b0a0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
2b0b0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2b0c0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
2b0d0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2b0e0 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
2b0f0 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
2b100 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
2b110 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
2b120 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
2b130 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
2b140 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
2b150 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
2b160 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
2b170 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
2b180 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
2b190 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
2b1a0 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
2b1b0 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
2b1c0 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
2b1d0 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
2b1e0 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
2b1f0 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
2b200 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
2b210 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
2b220 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
2b230 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
2b240 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
2b250 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
2b260 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2b270 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2b280 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
2b290 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2b2a0 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
2b2b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b2c0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2b2d0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2b2e0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2b2f0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
2b300 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2b310 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
2b320 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2b330 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2b340 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2b350 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
2b360 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
2b370 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
2b380 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2b390 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
2b3a0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
2b3b0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
2b3c0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78  oc( sizeof(*pCtx
2b3d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ) );.    if( pCt
2b3e0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
2b3f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2b400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b410 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61    /* NB: zFilena
2b420 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65  me exists and re
2b430 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2b440 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c  l the file is cl
2b450 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63  osed.      ** ac
2b460 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69  cording to requi
2b470 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20  rement F11141.  
2b480 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  So we do not nee
2b490 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20  d to make a.    
2b4a0 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
2b4b0 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20   filename. */.  
2b4c0 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68      pCtx->dbPath
2b4d0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2b4e0 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76      pCtx->reserv
2b4f0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72  ed = 0;.      sr
2b500 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20  andomdev();.    
2b510 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2b520 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ();.      rc = f
2b530 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2b540 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2b550 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2b560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2b580 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67  ee(pNew->locking
2b590 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
2b5a0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2b5b0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2b5c0 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d  );.        h = -
2b5d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2b5e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2b5f0 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d  );        .    }
2b600 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65  .  }.#endif..  e
2b610 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2b620 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63  Style == &dotloc
2b630 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
2b640 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
2b650 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2b660 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2b670 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2b680 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2b690 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
2b6a0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20  ontext .    */. 
2b6b0 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
2b6c0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c  le;.    int nFil
2b6d0 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72  ename;.    asser
2b6e0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2b6f0 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65  );.    nFilename
2b700 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2b710 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
2b720 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28     zLockFile = (
2b730 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
2b740 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65 29  alloc(nFilename)
2b750 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
2b760 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2b770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2b780 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2b790 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2b7a0 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20  intf(nFilename, 
2b7b0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20  zLockFile, "%s" 
2b7c0 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20  DOTLOCK_SUFFIX, 
2b7d0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2b7e0 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  }.    pNew->lock
2b7f0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f  ingContext = zLo
2b800 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  ckFile;.  }..#if
2b810 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c   OS_VXWORKS.  el
2b820 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2b830 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65  tyle == &semIoMe
2b840 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2b850 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
2b860 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
2b870 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
2b880 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
2b890 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   ** included in 
2b8a0 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f  the semLockingCo
2b8b0 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20  ntext.    */.   
2b8c0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2b8d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
2b8e0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2b8f0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2b900 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
2b910 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77  ITE_OK) && (pNew
2b920 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d  ->pInode->pSem==
2b930 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63  NULL) ){.      c
2b940 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20  har *zSemName = 
2b950 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
2b960 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  emName;.      in
2b970 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t n;.      sqlit
2b980 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
2b990 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61  PATHNAME, zSemNa
2b9a0 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20  me, "/%s.sem",. 
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d        pNew->pId-
2b9d0 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29  >zCanonicalName)
2b9e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31  ;.      for( n=1
2b9f0 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e  ; zSemName[n]; n
2ba00 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28  ++ ).        if(
2ba10 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f   zSemName[n]=='/
2ba20 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20  ' ) zSemName[n] 
2ba30 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65  = '_';.      pNe
2ba40 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2ba50 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e  = sem_open(zSemN
2ba60 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36  ame, O_CREAT, 06
2ba70 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  66, 1);.      if
2ba80 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  ( pNew->pInode->
2ba90 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c  pSem == SEM_FAIL
2baa0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
2bab0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2bac0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2bad0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
2bae0 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
2baf0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2bb00 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2bb10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 70   }.#endif.  .  p
2bb20 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  New->lastErrno =
2bb30 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   0;.#if OS_VXWOR
2bb40 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  KS.  if( rc!=SQL
2bb50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2bb60 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2bb70 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2bb80 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20  _LINE__);.    h 
2bb90 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69  = -1;.    osUnli
2bba0 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
2bbb0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2bbc0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
2bbd0 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69  ELETE;.  }.#endi
2bbe0 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  f.  if( rc!=SQLI
2bbf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2bc00 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2bc10 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2bc20 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65  LINE__);.  }else
2bc30 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74  {.    pNew->pMet
2bc40 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74  hod = pLockingSt
2bc50 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  yle;.    OpenCou
2bc60 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65  nter(+1);.    ve
2bc70 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29  rifyDbFile(pNew)
2bc80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2bc90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2bca0 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
2bcb0 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68   directory in wh
2bcc0 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f  ich to put tempo
2bcd0 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49  rary files..** I
2bce0 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65  f no suitable te
2bcf0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72  mporary file dir
2bd00 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f  ectory can be fo
2bd10 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  und, return NULL
2bd20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2bd30 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70  t char *unixTemp
2bd40 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20  FileDir(void){. 
2bd50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
2bd60 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
2bd70 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c  .     0,.     0,
2bd80 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22  .     "/var/tmp"
2bd90 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70  ,.     "/usr/tmp
2bda0 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  ",.     "/tmp",.
2bdb0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
2bdc0 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
2bdd0 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67   */.  };.  unsig
2bde0 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ned int i;.  str
2bdf0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
2be00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2be10 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b   = 0;..  azDirs[
2be20 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
2be30 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69  p_directory;.  i
2be40 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20  f( !azDirs[1] ) 
2be50 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
2be60 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
2be70 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2be80 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
2be90 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
2bea0 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
2beb0 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
2bec0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bed0 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c  if( osStat(zDir,
2bee0 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
2bef0 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
2bf00 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
2bf10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bf20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44   if( osAccess(zD
2bf30 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e  ir, 07) ) contin
2bf40 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ue;.    break;. 
2bf50 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72   }.  return zDir
2bf60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2bf70 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
2bf80 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
2bf90 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61    zBuf must be a
2bfa0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
2bfb0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
2bfc0 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62  ss and must be b
2bfd0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
2bfe0 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56  d at least.** pV
2bff0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62  fs->mxPathname b
2c000 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
2c010 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
2c020 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
2c030 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
2c040 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
2c050 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
2c060 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
2c070 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
2c080 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
2c090 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
2c0a0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
2c0b0 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65  6789";.  unsigne
2c0c0 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f  d int i, j;.  co
2c0d0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a  nst char *zDir;.
2c0e0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
2c0f0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
2c100 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
2c110 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
2c120 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
2c130 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
2c140 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
2c150 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
2c160 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
2c170 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
2c180 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
2c190 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
2c1a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2c1b0 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e   );..  zDir = un
2c1c0 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b  ixTempFileDir();
2c1d0 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29  .  if( zDir==0 )
2c1e0 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20   zDir = ".";..  
2c1f0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2c200 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
2c210 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
2c220 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
2c230 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d  y file .  ** nam
2c240 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  e. If it is not,
2c250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c260 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  RROR..  */.  if(
2c270 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b   (strlen(zDir) +
2c280 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54   strlen(SQLITE_T
2c290 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
2c2a0 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f   + 18) >= (size_
2c2b0 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65  t)nBuf ){.    re
2c2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2c2d0 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20  R;.  }..  do{.  
2c2e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2c2f0 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66  tf(nBuf-18, zBuf
2c300 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
2c310 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
2c320 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28  zDir);.    j = (
2c330 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29  int)strlen(zBuf)
2c340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
2c350 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
2c360 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
2c370 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
2c380 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
2c390 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
2c3a0 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
2c3b0 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
2c3c0 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
2c3d0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
2c3e0 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42  f[j] = 0;.    zB
2c3f0 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d  uf[j+1] = 0;.  }
2c400 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
2c410 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
2c420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c430 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2c440 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2c450 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
2c460 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
2c470 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
2c480 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
2c490 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
2c4a0 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
2c4b0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2c4c0 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
2c4d0 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
2c4e0 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
2c4f0 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
2c500 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2c510 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
2c520 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c530 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2c540 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
2c550 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
2c560 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
2c570 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2c580 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2c590 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
2c5a0 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
2c5b0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
2c5c0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
2c5d0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
2c5e0 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
2c5f0 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
2c600 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
2c610 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
2c620 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
2c630 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2c640 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
2c650 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
2c660 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
2c670 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
2c680 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
2c690 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2c6a0 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
2c6b0 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
2c6c0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2c6d0 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
2c6e0 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
2c6f0 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
2c700 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
2c710 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
2c720 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
2c730 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
2c740 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
2c750 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
2c760 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
2c770 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
2c780 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
2c790 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
2c7a0 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Locking" at the
2c7b0 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66   start of this f
2c7c0 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74  ile for .** furt
2c7d0 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73  her details. Als
2c7e0 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e  o, ticket #4018.
2c7f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74  .**.** If a suit
2c800 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
2c810 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  ptor is found, t
2c820 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e  hen it is return
2c830 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63  ed. If no.** suc
2c840 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
2c850 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31  r is located, -1
2c860 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2c870 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73  .static UnixUnus
2c880 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62  edFd *findReusab
2c890 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leFd(const char 
2c8a0 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67  *zPath, int flag
2c8b0 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  s){.  UnixUnused
2c8c0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b  Fd *pUnused = 0;
2c8d0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65  ..  /* Do not se
2c8e0 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2c8f0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2c900 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e  or on vxworks. N
2c910 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  ot because.  ** 
2c920 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f  vxworks would no
2c930 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74  t benefit from t
2c940 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69  he change (it mi
2c950 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73  ght, we're not s
2c960 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62  ure),.  ** but b
2c970 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f  ecause no way to
2c980 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72   test it is curr
2c990 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e  ently available.
2c9a0 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20   It is better . 
2c9b0 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20   ** not to risk 
2c9c0 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73  breaking vxworks
2c9d0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
2c9e0 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e   sake of such an
2c9f0 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66   obscure .  ** f
2ca00 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20  eature.  */.#if 
2ca10 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74  !OS_VXWORKS.  st
2ca20 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66     /* Results of
2ca50 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a   stat() call */.
2ca60 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
2ca70 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
2ca80 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
2ca90 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
2caa0 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
2cab0 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
2cac0 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
2cad0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2cae0 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
2caf0 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
2cb00 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
2cb10 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
2cb20 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
2cb30 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
2cb40 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
2cb50 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
2cb60 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
2cb70 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
2cb80 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
2cb90 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
2cba0 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
2cbb0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
2cbc0 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
2cbd0 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
2cbe0 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
2cbf0 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
2cc00 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
2cc10 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
2cc20 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
2cc30 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  esusable file de
2cc40 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2cc50 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2cc60 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2cc70 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2cc80 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2cc90 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
2cca0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2ccb0 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
2ccc0 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
2ccd0 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
2cce0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
2ccf0 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd10 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
2cd20 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
2cd30 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
2cd40 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
2cd50 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
2cd60 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
2cd70 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
2cd80 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
2cd90 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
2cda0 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
2cdb0 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
2cdc0 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
2cdd0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
2cde0 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
2cdf0 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
2ce00 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
2ce10 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
2ce20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2ce30 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2ce40 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2ce50 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
2ce60 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
2ce70 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
2ce80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ce90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2cea0 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
2ceb0 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
2cec0 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2ced0 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
2cee0 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
2cef0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2cf00 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
2cf10 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
2cf20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
2cf30 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
2cf40 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2cf50 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
2cf60 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
2cf70 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
2cf80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2cf90 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2cfa0 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
2cfb0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2cfc0 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
2cfd0 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
2cfe0 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  * In most cases 
2cff0 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74  cases, this rout
2d000 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  ine sets *pMode 
2d010 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c  to 0, which will
2d020 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e   become.** an in
2d030 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75  dication to robu
2d040 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65  st_open() to cre
2d050 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69  ate the file usi
2d060 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46  ng.** SQLITE_DEF
2d070 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2d080 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62  SIONS adjusted b
2d090 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
2d0a0 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20  But if the file 
2d0b0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
2d0c0 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72  a WAL or regular
2d0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
2d0e0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
2d0f0 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
2d100 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2d110 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  r the permission
2d120 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s on the .** cor
2d130 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62  responding datab
2d140 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ase file and set
2d150 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73  s *pMode to this
2d160 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72   value. Whenever
2d170 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57   .** possible, W
2d180 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  AL and journal f
2d190 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
2d1a0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2d1b0 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
2d1c0 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  as the associate
2d1d0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
2d1e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
2d1f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2d200 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20  NAMES option is 
2d210 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
2d220 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69  e.** original fi
2d230 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69  lename is unavai
2d240 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f  lable.  But 8_3_
2d250 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73  NAMES is only us
2d260 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69  ed for.** FAT fi
2d270 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65  lesystems and pe
2d280 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74  rmissions do not
2d290 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73   matter there, s
2d2a0 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68  o just use.** th
2d2b0 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73  e default permis
2d2c0 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
2d2d0 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46   int findCreateF
2d2e0 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
2d2f0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2d300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d310 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73  th of file (poss
2d320 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61  ibly) being crea
2d330 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ted */.  int fla
2d340 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2d350 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2d360 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20  s passed as 4th 
2d370 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65  argument to xOpe
2d380 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20  n() */.  mode_t 
2d390 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pMode,         
2d3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d3b0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
2d3c0 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a  open file with *
2d3d0 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c  /.  uid_t *pUid,
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20      /* OUT: uid 
2d400 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
2d410 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  le */.  gid_t *p
2d420 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
2d430 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d440 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  gid to set on th
2d450 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  e file */.){.  i
2d460 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d470 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2d480 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2d490 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20  .  *pMode = 0;. 
2d4a0 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70   *pUid = 0;.  *p
2d4b0 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66  Gid = 0;.  if( f
2d4c0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
2d4d0 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
2d4e0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2d4f0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44  ) ){.    char zD
2d500 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  b[MAX_PATHNAME+1
2d510 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ];     /* Databa
2d520 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  se file path */.
2d530 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20      int nDb;    
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
2d560 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44  alid bytes in zD
2d570 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  b */.    struct 
2d580 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2d590 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2d5a0 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61   of stat() on da
2d5b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2d5c0 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20      /* zPath is 
2d5d0 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20  a path to a WAL 
2d5e0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  or journal file.
2d5f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2d600 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20  lock derives.   
2d610 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20   ** the path to 
2d620 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
2d630 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f  atabase file fro
2d640 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c  m zPath. This bl
2d650 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20  ock handles.    
2d660 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
2d670 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69   naming conventi
2d680 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ons:.    **.    
2d690 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2d6a0 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20  b>-journal".    
2d6b0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2d6c0 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20  b>-wal".    **  
2d6d0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
2d6e0 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  ournalNN".    **
2d6f0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2d700 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20  -walNN".    **. 
2d710 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69     ** where NN i
2d720 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62  s a decimal numb
2d730 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e  er. The NN namin
2d740 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20  g schemes are . 
2d750 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
2d760 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78  e test_multiplex
2d770 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a  .c module..    *
2d780 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69  /.    nDb = sqli
2d790 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2d7a0 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20  h) - 1; .#ifdef 
2d7b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2d7c0 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c  3_NAMES.    whil
2d7d0 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69  e( nDb>0 && sqli
2d7e0 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68  te3Isalnum(zPath
2d7f0 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a  [nDb]) ) nDb--;.
2d800 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c      if( nDb==0 |
2d810 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  | zPath[nDb]!='-
2d820 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ' ) return SQLIT
2d830 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  E_OK;.#else.    
2d840 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62  while( zPath[nDb
2d850 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
2d860 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b  assert( nDb>0 );
2d870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
2d880 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20  Path[nDb]!='\n' 
2d890 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a  );.      nDb--;.
2d8a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2d8b0 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61   memcpy(zDb, zPa
2d8c0 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44  th, nDb);.    zD
2d8d0 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a  b[nDb] = '\0';..
2d8e0 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
2d8f0 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29  t(zDb, &sStat) )
2d900 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d  {.      *pMode =
2d910 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26   sStat.st_mode &
2d920 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55   0777;.      *pU
2d930 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
2d940 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d  d;.      *pGid =
2d950 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
2d960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d970 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2d980 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
2d990 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
2d9a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2d9b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
2d9c0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
2d9d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2d9e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
2d9f0 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
2da00 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
2da10 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
2da20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
2da30 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
2da40 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
2da50 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
2da60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
2da70 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
2da80 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2da90 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
2daa0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
2dab0 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
2dac0 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
2dad0 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
2dae0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
2daf0 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
2db00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
2db10 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
2db20 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
2db30 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
2db40 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
2db50 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
2db60 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2db70 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
2db80 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
2db90 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
2dba0 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
2dbb0 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
2dbc0 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
2dbd0 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
2dbe0 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
2dbf0 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
2dc00 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2dc10 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
2dc20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
2dc30 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
2dc40 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
2dc50 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
2dc60 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
2dc70 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
2dc80 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
2dc90 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
2dca0 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
2dcb0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
2dcc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2dcd0 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
2dce0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2dcf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
2dd00 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  FS for which thi
2dd10 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d  s is the xOpen m
2dd20 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
2dd30 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2dd40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e          /* Pathn
2dd50 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
2dd60 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  e opened */.  sq
2dd70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2dd80 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2dd90 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2dda0 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  r to be filled i
2ddb0 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  n */.  int flags
2ddc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ddd0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61      /* Input fla
2dde0 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  gs to control th
2ddf0 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69  e opening */.  i
2de00 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
2de10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2de20 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75  utput flags retu
2de30 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63  rned to SQLite c
2de40 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ore */.){.  unix
2de50 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
2de60 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
2de70 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
2de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de90 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2dea0 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
2deb0 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  n() */.  int ope
2dec0 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
2ded0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2dee0 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
2def0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  () */.  int eTyp
2df00 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
2df10 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
2df20 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
2df30 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20  /.  int noLock; 
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2df60 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  it locking primi
2df70 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tives */.  int r
2df80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2df90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
2dfa0 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
2dfb0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  e */.  int ctrlF
2dfc0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2dfd0 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c        /* UNIXFIL
2dfe0 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  E_* flags */..  
2dff0 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
2e000 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2e010 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
2e020 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
2e030 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2e040 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
2e050 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
2e060 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
2e070 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2e080 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
2e090 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
2e0a0 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
2e0b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e0c0 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  NLY);.  int isRe
2e0d0 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
2e0e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e0f0 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20  READWRITE);.#if 
2e100 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2e110 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e  CKING_STYLE.  in
2e120 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d  t isAutoProxy  =
2e130 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e140 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29  _OPEN_AUTOPROXY)
2e150 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
2e160 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2e170 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
2e180 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2e190 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
2e1a0 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20  sInfo;.#endif.. 
2e1b0 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
2e1c0 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e  a master or main
2e1d0 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  -file journal, t
2e1e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
2e1f0 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69  l open.  ** a fi
2e200 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le-descriptor on
2e210 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
2e220 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  oo. The first ti
2e230 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20  me unixSync().  
2e240 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ** is called the
2e250 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
2e260 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2e270 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64  be fsync()ed and
2e280 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a   close()d..  */.
2e290 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20    int syncDir = 
2e2a0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
2e2b0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
2e2c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
2e2d0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
2e2e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e2f0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2e300 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2e310 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2e320 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
2e330 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
2e340 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
2e350 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2e360 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
2e370 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
2e380 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
2e390 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
2e3a0 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
2e3b0 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
2e3c0 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
2e3d0 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63  PATHNAME+2];.  c
2e3e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2e3f0 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
2e400 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
2e410 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
2e420 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
2e430 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
2e440 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
2e450 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
2e460 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
2e470 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
2e480 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
2e490 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
2e4a0 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
2e4b0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
2e4c0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
2e4d0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
2e4e0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2e4f0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
2e500 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
2e510 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
2e520 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2e530 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2e540 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
2e550 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
2e560 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
2e570 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
2e580 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
2e590 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
2e5a0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2e5b0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2e5c0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
2e5d0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
2e5e0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
2e5f0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
2e600 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
2e610 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
2e620 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
2e630 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
2e640 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
2e650 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
2e660 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
2e670 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
2e680 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
2e690 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2e6a0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2e6b0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2e6c0 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
2e6d0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2e6e0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2e6f0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2e700 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
2e710 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2e720 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2e730 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2e740 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2e750 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
2e760 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
2e770 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
2e780 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
2e790 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
2e7a0 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
2e7b0 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
2e7c0 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
2e7d0 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
2e7e0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2e7f0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2e800 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2e810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2e820 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
2e830 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e840 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
2e850 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e860 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
2e870 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2e880 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2e890 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
2e8a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2e8b0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2e8c0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
2e8d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2e8e0 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
2e8f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2e900 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 6d  EN_WAL.  );..  m
2e910 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
2e920 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a  of(unixFile));..
2e930 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
2e940 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2e950 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73   ){.    UnixUnus
2e960 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20  edFd *pUnused;. 
2e970 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e     pUnused = fin
2e980 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d  dReusableFd(zNam
2e990 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  e, flags);.    i
2e9a0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2e9b0 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
2e9c0 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->fd;.    }else{
2e9d0 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2e9e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2e9f0 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2ea00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
2ea10 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2ea20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ea30 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2ea40 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
2ea50 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20  ed = pUnused;.. 
2ea60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
2ea70 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
2ea80 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
2ea90 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
2eaa0 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20  not.    ** URIs 
2eab0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
2eac0 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
2ead0 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
2eae0 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73  ed into.    ** s
2eaf0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
2eb00 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
2eb10 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
2eb20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
2eb30 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e   || zName[strlen
2eb40 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2eb50 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ..  }else if( !z
2eb60 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
2eb70 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
2eb80 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2eb90 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
2eba0 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
2ebb0 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
2ebc0 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b  te && !syncDir);
2ebd0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
2ebe0 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
2ebf0 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61  THNAME+2, zTmpna
2ec00 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
2ec10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ec20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ec30 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
2ec40 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20   zTmpname;..    
2ec50 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d  /* Generated tem
2ec60 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73  porary filenames
2ec70 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62   are always doub
2ec80 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
2ec90 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73  ed.    ** for us
2eca0 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69  e by sqlite3_uri
2ecb0 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2ecc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61  .    assert( zNa
2ecd0 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2ece0 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  +1]==0 );.  }.. 
2ecf0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
2ed00 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
2ed10 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
2ed20 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
2ed30 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
2ed40 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
2ed50 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
2ed60 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
2ed70 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
2ed80 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
2ed90 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
2eda0 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
2edb0 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
2edc0 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
2edd0 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
2ede0 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
2edf0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
2ee00 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
2ee10 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
2ee20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
2ee30 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
2ee40 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
2ee50 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
2ee60 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
2ee70 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
2ee80 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
2ee90 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
2eea0 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
2eeb0 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
2eec0 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
2eed0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
2eee0 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
2eef0 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2ef00 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
2ef10 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
2ef20 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74  ith */.    uid_t
2ef30 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   uid;           
2ef40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
2ef50 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
2ef60 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64  */.    gid_t gid
2ef70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ef80 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20       /* Groupid 
2ef90 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
2efa0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
2efb0 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
2efc0 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
2efd0 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29  ode, &uid, &gid)
2efe0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2eff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f000 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e   assert( !p->pUn
2f010 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
2f020 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
2f030 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
2f040 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f050 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2f060 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2f070 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
2f080 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
2f090 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
2f0a0 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
2f0b0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
2f0c0 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
2f0d0 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
2f0e0 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
2f0f0 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
2f100 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
2f110 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
2f120 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
2f130 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
2f140 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
2f150 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2f160 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
2f170 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
2f180 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
2f190 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2f1a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
2f1b0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
2f1c0 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
2f1d0 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
2f1e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2f1f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2f200 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2f210 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73  RDONLY;.      is
2f220 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
2f230 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2f240 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
2f250 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
2f260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f270 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  fd<0 ){.      rc
2f280 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2f290 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2f2a0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e  BKPT, "open", zN
2f2b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
2f2c0 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2f2d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2f2e0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
2f2f0 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
2f300 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67   and if creating
2f310 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a   a new rollback.
2f320 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f      ** journal o
2f330 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20  r WAL file, set 
2f340 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  the ownership of
2f350 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
2f360 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  WAL to be.    **
2f370 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2f380 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
2f390 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2f3a0 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2f3b0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2f3c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f3d0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f  RNAL) ){.      o
2f3e0 73 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  sFchown(fd, uid,
2f3f0 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
2f400 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
2f410 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
2f420 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
2f430 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
2f440 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
2f450 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
2f460 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
2f470 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2f480 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
2f490 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
2f4a0 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
2f4b0 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
2f4c0 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20  = zName;.#else. 
2f4d0 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d     osUnlink(zNam
2f4e0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  e);.#endif.  }.#
2f4f0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2f500 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2f510 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70   else{.    p->op
2f520 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  enFlags = openFl
2f530 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ags;.  }.#endif.
2f540 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70  .  noLock = eTyp
2f550 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f560 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20  AIN_DB;..  .#if 
2f570 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2f580 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
2f590 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2f5a0 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28  E.  if( fstatfs(
2f5b0 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  fd, &fsInfo) == 
2f5c0 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  -1 ){.    ((unix
2f5d0 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 6c 61  File*)pFile)->la
2f5e0 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2f5f0 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
2f600 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
2f610 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
2f620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
2f630 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
2f640 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
2f650 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
2f660 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
2f670 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2f680 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
2f690 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
2f6a0 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23  _IS_MSDOS;.  }.#
2f6b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
2f6c0 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  up appropriate c
2f6d0 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66  trlFlags */.  if
2f6e0 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20  ( isDelete )    
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2f700 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2f710 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20  E_DELETE;.  if( 
2f720 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20  isReadonly )    
2f730 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
2f740 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2f750 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f  RDONLY;.  if( no
2f760 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20  Lock )          
2f770 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
2f780 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
2f790 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63  LOCK;.  if( sync
2f7a0 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20  Dir )           
2f7b0 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
2f7c0 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  |= UNIXFILE_DIRS
2f7d0 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  YNC;.  if( flags
2f7e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
2f7f0 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c  RI ) ctrlFlags |
2f800 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a  = UNIXFILE_URI;.
2f810 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2f820 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2f830 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  .#if SQLITE_PREF
2f840 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2f850 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d  .  isAutoProxy =
2f860 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
2f870 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20   isAutoProxy && 
2f880 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26  (zPath!=NULL) &&
2f890 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56   (!noLock) && pV
2f8a0 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20  fs->xOpen ){.   
2f8b0 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20   char *envforce 
2f8c0 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
2f8d0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2f8e0 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20  KING");.    int 
2f8f0 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20  useProxy = 0;.. 
2f900 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
2f910 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2f920 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20  ==1 means force 
2f930 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79  always use proxy
2f940 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a  , 0 means .    *
2f950 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78  * never use prox
2f960 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73  y, NULL means us
2f970 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d  e proxy for non-
2f980 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79  local files only
2f990 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e  .  */.    if( en
2f9a0 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a  vforce!=NULL ){.
2f9b0 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d        useProxy =
2f9c0 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e   atoi(envforce)>
2f9d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2f9e0 20 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a      if( statfs(z
2f9f0 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
2fa00 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
2fa10 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
2fa20 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c  e close(fd) call
2fa30 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e   is sub-optimal.
2fa40 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
2fa50 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ned.        ** w
2fa60 69 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61  ith fd is a data
2fa70 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74  base file, and t
2fa80 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63  here are other c
2fa90 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a  onnections open.
2faa0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
2fab0 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
2fac0 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69   currently holdi
2fad0 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ng advisory lock
2fae0 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20  s on it,.       
2faf0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c   ** then the cal
2fb00 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c  l to close() wil
2fb10 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c  l cancel those l
2fb20 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63  ocks. In practic
2fb30 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  e,.        ** we
2fb40 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61  're assuming tha
2fb50 74 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e  t statfs() doesn
2fb60 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74  't fail very oft
2fb70 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20  en. At least.   
2fb80 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c       ** not whil
2fb90 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  e other file des
2fba0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
2fbb0 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
2fbc0 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ess on.        *
2fbd0 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  * the same file 
2fbe0 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f  are working.  */
2fbf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74  .        p->last
2fc00 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2fc10 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c         robust_cl
2fc20 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2fc30 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  E__);.        rc
2fc40 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2fc50 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20 20  ACCESS;.        
2fc60 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2fc70 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
2fc80 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
2fc90 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
2fca0 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
2fcb0 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
2fcc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
2fcd0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
2fce0 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
2fcf0 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
2fd00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2fd10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fd20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
2fd30 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
2fd40 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
2fd50 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
2fd60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2fd70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fd80 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
2fd90 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
2fda0 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
2fdb0 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
2fdc0 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
2fdd0 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
2fde0 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
2fdf0 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
2fe00 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
2fe10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
2fe20 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
2fe30 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
2fe40 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
2fe50 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
2fe60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fe70 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
2fe80 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
2fe90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2fea0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2feb0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
2fec0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
2fed0 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20  .#endif.  .  rc 
2fee0 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
2fef0 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
2ff00 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
2ff10 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73  gs);..open_finis
2ff20 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
2ff30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ff40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2ff50 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20  pUnused);.  }.  
2ff60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2ff70 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2ff80 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49  file at zPath. I
2ff90 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
2ffa0 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
2ffb0 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64  fsync().** the d
2ffc0 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64  irectory after d
2ffd0 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
2ffe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fff0 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71  unixDelete(.  sq
30000 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
30010 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63  ed,     /* VFS c
30020 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61  ontaining this a
30030 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65  s the xDelete me
30040 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
30050 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
30060 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
30070 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
30080 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79  d */.  int dirSy
30090 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
300a0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79   /* If true, fsy
300b0 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20 61  nc() directory a
300c0 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69  fter deleting fi
300d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
300e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
300f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30100 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
30110 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
30120 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
30130 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28  R_DELETE);.  if(
30140 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29   osUnlink(zPath)
30150 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66  ==(-1) ){.    if
30160 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20  ( errno==ENOENT 
30170 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
30180 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
30190 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  E_NOENT;.    }el
301a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  se{.      rc = u
301b0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
301c0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
301d0 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68   "unlink", zPath
301e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
301f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e  urn rc;.  }.#ifn
30200 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
30210 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
30220 20 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d   (dirSync & 1)!=
30230 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  0 ){.    int fd;
30240 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
30250 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
30260 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
30270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30280 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
30290 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
302a0 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20  d)==-1 ).#else. 
302b0 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28 66       if( fsync(f
302c0 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  d) ).#endif.    
302d0 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d    {.        rc =
302e0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
302f0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
30300 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a  SYNC, "fsync", z
30310 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
30320 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
30330 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(0, fd, __LINE_
30340 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  _);.    }else if
30350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
30360 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72  TOPEN ){.      r
30370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30380 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
30390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
303a0 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
303b0 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
303c0 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
303d0 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
303e0 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
303f0 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
30400 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
30410 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
30420 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
30430 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
30440 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
30450 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
30460 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
30470 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
30480 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
30490 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
304a0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
304b0 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
304c0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
304d0 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
304e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
304f0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
30500 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
30510 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
30520 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
30530 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
30540 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
30550 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
30560 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
30570 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
30580 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
30590 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
305a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
305b0 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
305c0 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
305d0 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
305e0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
305f0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
30600 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
30610 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
30620 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30  .  int amode = 0
30630 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30640 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30650 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
30660 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
30670 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
30680 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
30690 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
306a0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
306b0 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  S:.      amode =
306c0 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65   F_OK;.      bre
306d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
306e0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
306f0 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64  RITE:.      amod
30700 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20  e = W_OK|R_OK;. 
30710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30720 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
30730 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20 20 61  SS_READ:.      a
30740 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20  mode = R_OK;.   
30750 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
30760 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
30770 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
30780 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
30790 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
307a0 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50 61 74  = (osAccess(zPat
307b0 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20  h, amode)==0);. 
307c0 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
307d0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
307e0 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a   && *pResOut ){.
307f0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
30800 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  buf;.    if( 0==
30810 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
30820 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
30830 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ze==0 ){.      *
30840 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20  pResOut = 0;.   
30850 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
30860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
30870 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
30880 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
30890 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
308a0 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65  me. The relative
308b0 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72   path.** is stor
308c0 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d  ed as a nul-term
308d0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
308e0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
308f0 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61  ted to by.** zPa
30900 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20  th. .**.** zOut 
30910 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
30920 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73  er of at least s
30930 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
30940 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20  hname bytes .** 
30950 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d  (in this case, M
30960 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65  AX_PATHNAME byte
30970 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74  s). The full-pat
30980 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  h is written to.
30990 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62  ** this buffer b
309a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
309b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
309c0 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
309d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
309e0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
309f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
30a00 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
30a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
30a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30a30 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
30a40 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
30a50 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
30a80 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
30a90 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  s */.  char *zOu
30aa0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
30ab0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
30ac0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f  uffer */.){..  /
30ad0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
30ae0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
30af0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
30b00 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
30b10 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
30b20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
30b30 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
30b40 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
30b50 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
30b60 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
30b70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
30b80 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
30b90 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
30ba0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
30bb0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
30bc0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
30bd0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
30be0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
30bf0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
30c00 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
30c10 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
30c20 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
30c30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
30c40 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f  Vfs);..  zOut[nO
30c50 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut-1] = '\0';.  
30c60 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f  if( zPath[0]=='/
30c70 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
30c80 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
30c90 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
30ca0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
30cb0 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69   int nCwd;.    i
30cc0 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
30cd0 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
30ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
30cf0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
30d00 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
30d10 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
30d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
30d30 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
30d40 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
30d50 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d  3_snprintf(nOut-
30d60 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64  nCwd, &zOut[nCwd
30d70 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68 29  ], "/%s", zPath)
30d80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
30d90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
30da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30db0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
30dc0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
30dd0 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
30de0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
30df0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
30e00 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
30e10 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
30e20 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
30e30 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
30e40 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
30e50 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20  dlfcn.h>.static 
30e60 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e  void *unixDlOpen
30e70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
30e80 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61  tUsed, const cha
30e90 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
30ea0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
30eb0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
30ec0 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
30ed0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
30ee0 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
30ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  }../*.** SQLite 
30f00 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
30f10 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ion immediately 
30f20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
30f30 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a  unixDlSym() or.*
30f40 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66  * unixDlOpen() f
30f50 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20  ails (returns a 
30f60 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49  null pointer). I
30f70 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65  f a more detaile
30f80 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  d error.** messa
30f90 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ge is available,
30fa0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
30fb0 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f  o zBufOut. If no
30fc0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
30fd0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
30fe0 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20  zBufOut is left 
30ff0 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53  unmodified and S
31000 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66  QLite uses a def
31010 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  ault.** error me
31020 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssage..*/.static
31030 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f   void unixDlErro
31040 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
31050 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66  otUsed, int nBuf
31060 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
31070 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
31080 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50  zErr;.  UNUSED_P
31090 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
310a0 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
310b0 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20  tex();.  zErr = 
310c0 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  dlerror();.  if(
310d0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c   zErr ){.    sql
310e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
310f0 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73  uf, zBufOut, "%s
31100 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  ", zErr);.  }.  
31110 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
31120 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
31130 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69  (*unixDlSym(sqli
31140 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31150 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74  , void *p, const
31160 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69   char*zSym))(voi
31170 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47  d){.  /* .  ** G
31180 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  CC with -pedanti
31190 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68  c-errors says th
311a0 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20  at C90 does not 
311b0 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f  allow a void* to
311c0 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e   be.  ** cast in
311d0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
311e0 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64  a function.  And
311f0 20 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79   yet the library
31200 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65   dlsym() routine
31210 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
31220 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72  void* which is r
31230 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
31240 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
31250 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a  So how do we.  *
31260 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69  * use dlsym() wi
31270 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
31280 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ors?.  **.  ** V
31290 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20  ariable x below 
312a0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
312b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
312c0 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a  function taking.
312d0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20    ** parameters 
312e0 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20  void* and const 
312f0 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e  char* and return
31300 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
31310 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a   a function..  *
31320 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  * We initialize 
31330 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69  x by assigning i
31340 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
31350 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74  he dlsym() funct
31360 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20  ion..  ** (That 
31370 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69  assignment requi
31380 72 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68  res a cast.)  Th
31390 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66  en we call the f
313a0 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a  unction that.  *
313b0 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  * x points to.  
313c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
313d0 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75  work-around is u
313e0 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20  nlikely to work 
313f0 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79  correctly on any
31400 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20   system where.  
31410 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61  ** you really ca
31420 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63  nnot cast a func
31430 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74  tion pointer int
31440 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68  o void*.  But th
31450 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  en, on the.  ** 
31460 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79  other hand, dlsy
31470 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  m() will not wor
31480 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74  k on such a syst
31490 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65  em either, so we
314a0 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72   have.  ** not r
314b0 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68  eally lost anyth
314c0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64  ing..  */.  void
314d0 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f   (*(*x)(void*,co
314e0 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64  nst char*))(void
314f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
31500 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
31510 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29    x = (void(*(*)
31520 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
31530 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d  r*))(void))dlsym
31540 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28  ;.  return (*x)(
31550 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74  p, zSym);.}.stat
31560 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c  ic void unixDlCl
31570 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
31580 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31590 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
315a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
315b0 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65  Used);.  dlclose
315c0 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  (pHandle);.}.#el
315d0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
315e0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
315f0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
31600 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69  */.  #define uni
31610 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  xDlOpen  0.  #de
31620 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72  fine unixDlError
31630 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
31640 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  xDlSym   0.  #de
31650 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65  fine unixDlClose
31660 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
31670 20 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   Write nBuf byte
31680 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61  s of random data
31690 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
316a0 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
316b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
316c0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
316d0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
316e0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
316f0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
31700 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
31710 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73  ed);.  assert((s
31720 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a  ize_t)nBuf>=(siz
31730 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65  eof(time_t)+size
31740 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a  of(int)));..  /*
31750 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
31760 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
31770 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
31780 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
31790 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
317a0 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
317b0 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
317c0 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
317d0 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
317e0 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
317f0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
31800 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
31810 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
31820 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
31830 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
31840 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
31850 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
31860 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
31870 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
31880 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
31890 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
318a0 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
318b0 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
318c0 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
318d0 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
318e0 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
318f0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
31900 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
31910 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
31920 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
31930 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
31940 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
31950 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
31960 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
31970 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
31980 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
31990 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
319a0 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
319b0 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
319c0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
319d0 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65 66 69  nBuf);.#if !defi
319e0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
319f0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  .  {.    int pid
31a00 2c 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66  , fd, got;.    f
31a10 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
31a20 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
31a30 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  O_RDONLY, 0);.  
31a40 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
31a50 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
31a60 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
31a70 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
31a80 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
31a90 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74  .      pid = get
31aa0 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pid();.      mem
31ab0 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
31ac0 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  (t)], &pid, size
31ad0 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 20 20  of(pid));.      
31ae0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
31af0 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28  )+sizeof(pid)<=(
31b00 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
31b10 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
31b20 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 70  of(t) + sizeof(p
31b30 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
31b40 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20        do{ got = 
31b50 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
31b60 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
31b70 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
31b80 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72  EINTR );.      r
31b90 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
31ba0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
31bb0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
31bc0 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a   return nBuf;.}.
31bd0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
31be0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
31bf0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
31c00 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
31c10 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  pt..** The argum
31c20 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
31c30 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
31c40 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65  s we want to sle
31c50 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ep..** The retur
31c60 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
31c70 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
31c80 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61  conds of sleep a
31c90 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65  ctually.** reque
31ca0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  sted from the un
31cb0 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
31cc0 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d  ng system, a num
31cd0 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  ber which.** mig
31ce0 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ht be greater th
31cf0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
31d00 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74  he argument, but
31d10 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61   not less.** tha
31d20 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
31d30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
31d40 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  ixSleep(sqlite3_
31d50 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
31d60 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
31d70 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
31d80 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
31d90 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73  c sp;..  sp.tv_s
31da0 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64  ec = microsecond
31db0 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73  s / 1000000;.  s
31dc0 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63  p.tv_nsec = (mic
31dd0 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30  roseconds % 1000
31de0 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e  000) * 1000;.  n
31df0 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55  anosleep(&sp, NU
31e00 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  LL);.  UNUSED_PA
31e10 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31e20 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
31e30 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64  seconds;.#elif d
31e40 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
31e50 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
31e60 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
31e70 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  oseconds);.  UNU
31e80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31e90 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
31ea0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
31eb0 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
31ec0 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
31ed0 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
31ee0 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
31ef0 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
31f00 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
31f20 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
31f30 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
31f40 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
31f50 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
31f60 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
31f70 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
31f80 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
31f90 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
31fa0 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
31fb0 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
31fc0 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
31fd0 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
31fe0 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
31ff0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
32000 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
32010 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
32020 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
32030 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
32040 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
32050 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
32060 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
32070 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
32080 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
32090 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
320a0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
320b0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
320c0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
320d0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
320e0 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
320f0 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
32100 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
32110 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
32120 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
32130 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
32140 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
32150 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
32160 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
32170 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
32180 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
32190 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
321a0 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
321b0 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
321c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
321d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
321e0 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
321f0 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
32200 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
32210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
32220 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
32230 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
32240 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65  *NotUsed, sqlite
32250 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
32260 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
32270 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
32280 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
32290 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
322a0 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74  4)8640000;.  int
322b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
322c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
322d0 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
322e0 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
322f0 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
32300 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
32310 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
32320 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
32330 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
32340 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
32350 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
32360 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
32370 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
32380 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
32390 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
323a0 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
323b0 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
323c0 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
323d0 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69  imeval sNow;.  i
323e0 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  f( gettimeofday(
323f0 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a  &sNow, 0)==0 ){.
32400 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69      *piNow = uni
32410 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
32420 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
32430 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
32440 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 20 20  tv_usec/1000;.  
32450 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
32460 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
32470 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
32480 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
32490 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
324a0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
324b0 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
324c0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
324d0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
324e0 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
324f0 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
32500 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32510 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
32520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
32530 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
32540 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
32550 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
32560 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
32570 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
32580 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
32590 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
325a0 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
325b0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
325c0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
325d0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
325e0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
325f0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
32600 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
32610 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
32620 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
32630 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
32640 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
32650 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32660 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32670 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54  c = unixCurrentT
32680 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
32690 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
326a0 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
326b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
326c0 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
326d0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
326e0 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
326f0 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
32700 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
32710 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
32720 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
32730 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
32740 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
32750 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
32760 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
32770 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
32780 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
32790 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
327a0 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
327b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
327c0 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
327d0 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
327e0 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
327f0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
32800 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
32810 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
32820 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
32830 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
32840 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
32850 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32860 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
32870 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32880 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
32890 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
328a0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
328b0 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
328c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
328d0 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
328e0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
328f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32900 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
32910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32950 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
32960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
329b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329c0 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
329d0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
329e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329f0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
32a00 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
32a10 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
32a20 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
32a30 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
32a40 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
32a50 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
32a60 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
32a70 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
32a80 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
32a90 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
32aa0 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
32ab0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
32ac0 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
32ad0 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
32ae0 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
32af0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
32b00 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
32b10 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
32b20 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
32b30 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
32b40 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
32b50 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
32b60 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
32b70 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
32b80 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
32b90 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
32ba0 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
32bb0 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
32bc0 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
32bd0 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
32be0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
32bf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
32c00 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
32c10 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
32c20 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
32c30 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
32c40 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
32c50 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
32c60 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
32c70 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
32c80 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
32c90 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
32ca0 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
32cb0 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
32cc0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
32cd0 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
32ce0 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
32cf0 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
32d00 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
32d10 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
32d20 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
32d30 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
32d40 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
32d50 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
32d60 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
32d70 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
32d80 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
32d90 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
32da0 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
32db0 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
32dc0 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
32dd0 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
32de0 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
32df0 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
32e00 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
32e10 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
32e20 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
32e30 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
32e40 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
32e50 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
32e60 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
32e70 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
32e80 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
32e90 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
32ea0 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
32eb0 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
32ec0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
32ed0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
32ee0 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
32ef0 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
32f00 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
32f10 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
32f20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
32f30 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
32f40 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
32f50 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
32f60 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
32f70 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
32f80 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
32f90 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
32fa0 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
32fb0 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
32fc0 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
32fd0 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
32fe0 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
32ff0 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
33000 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
33010 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
33020 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
33030 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
33040 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
33050 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
33060 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
33070 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
33080 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
33090 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
330a0 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
330b0 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
330c0 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
330d0 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
330e0 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
330f0 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
33100 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
33110 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
33120 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
33130 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
33140 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
33150 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
33160 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
33170 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
33180 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
33190 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
331a0 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
331b0 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
331c0 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
331d0 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
331e0 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
331f0 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
33200 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
33210 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
33220 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
33230 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
33240 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
33250 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
33260 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
33270 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
33280 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
33290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
332a0 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
332b0 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
332c0 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
332d0 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
332e0 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
332f0 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
33300 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
33310 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
33320 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
33330 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
33340 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
33350 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ILE,.**         
33360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70                <p
33370 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61  roxy_path> | ":a
33380 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69  uto:");.**  sqli
33390 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
333a0 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
333b0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
333c0 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70  YFILE, &<proxy_p
333d0 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
333e0 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
333f0 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
33400 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
33410 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
33420 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
33430 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
33440 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
33450 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
33460 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
33470 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
33480 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
33490 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
334a0 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
334b0 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
334c0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
334d0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
334e0 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
334f0 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
33500 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
33510 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
33520 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
33530 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
33540 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
33550 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
33560 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
33570 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
33580 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
33590 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
335a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
335b0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
335c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
335d0 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
335e0 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
335f0 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
33600 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
33610 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
33620 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
33630 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
33640 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
33650 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
33660 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
33670 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
33680 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
33690 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
336a0 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
336b0 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
336c0 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
336d0 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
336e0 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
336f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
33700 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
33710 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
33720 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
33730 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
33740 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
33750 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
33760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33770 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
33780 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
33790 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
337a0 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
337b0 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
337c0 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
337d0 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
337e0 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
337f0 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
33800 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
33810 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
33820 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
33830 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
33840 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
33850 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
33860 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
33870 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
33890 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
338a0 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
338b0 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
338c0 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
338d0 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
338e0 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
338f0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
33900 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
33910 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
33920 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
33930 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
33940 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
33950 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
33960 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
33970 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
33980 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
33990 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
339a0 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
339b0 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
339c0 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
339d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
339e0 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
339f0 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
33a00 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
33a10 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
33a20 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
33a30 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
33a40 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
33a50 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
33a60 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74 73 20  r it's contents 
33a70 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
33a80 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f  .** host ID and/
33a90 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74  or proxy path, t
33aa0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
33ab0 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20  escalated to an 
33ac0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63  exclusive.** loc
33ad0 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20  k and the conch 
33ae0 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73  file contents is
33af0 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
33b00 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72  e host ID and pr
33b10 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20  oxy.** path and 
33b20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e  the lock is down
33b30 67 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72  graded to a shar
33b40 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20  ed lock again.  
33b50 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20  If the conch.** 
33b60 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  is held by anoth
33b70 65 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68  er process (with
33b80 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c   a shared lock),
33b90 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
33ba0 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c  ock.** will fail
33bb0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
33bc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
33bd0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
33be0 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79  le - a single-by
33bf0 74 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  te file used for
33c00 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69   all advisory fi
33c10 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d  le locks.** norm
33c20 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68  ally taken on th
33c30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33c40 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66     This allows f
33c50 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a  or safe sharing.
33c60 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
33c70 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74  se file for mult
33c80 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64  iple readers and
33c90 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20   writers on the 
33ca0 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68  same.** host (th
33cb0 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20  e conch ensures 
33cc0 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73  that they all us
33cd0 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c  e the same local
33ce0 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a   lock file)..**.
33cf0 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68  ** Requesting th
33d00 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65  e lock proxy doe
33d10 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c  s not immediatel
33d20 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68  y take the conch
33d30 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  , it is.** only 
33d40 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66  taken when the f
33d50 69 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20  irst request to 
33d60 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69  lock database fi
33d70 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a  le is made.  .**
33d80 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
33d90 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74  e semantics of t
33da0 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c  he traditional l
33db0 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c  ocking behavior,
33dc0 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e   where.** openin
33dd0 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  g a connection t
33de0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
33df0 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  e does not take 
33e00 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a  a lock on it..**
33e10 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   The shared lock
33e20 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c   and an open fil
33e30 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
33e40 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69   maintained unti
33e50 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63  l .** the connec
33e60 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
33e70 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20  base is closed. 
33e80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  .**.** The proxy
33e90 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f   file and the lo
33ea0 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65  ck file are neve
33eb0 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65  r deleted so the
33ec0 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74  y only need.** t
33ed0 6f 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65  o be created the
33ee0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79   first time they
33ef0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a   are used..**.**
33f00 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
33f10 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  ptions.** ------
33f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
33f30 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52  **.**  SQLITE_PR
33f40 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
33f50 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44  NG.**.**       D
33f60 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63  atabase files ac
33f70 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f  cessed on non-lo
33f80 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73  cal file systems
33f90 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75   are.**       au
33fa0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66  tomatically conf
33fb0 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79  igured for proxy
33fc0 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66   locking, lock f
33fd0 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  iles are.**     
33fe0 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69    named automati
33ff0 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20  cally using the 
34000 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a  same logic as.**
34010 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f         PRAGMA lo
34020 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a  ck_proxy_file=":
34030 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a  auto:".**    .**
34040 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44    SQLITE_PROXY_D
34050 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  EBUG.**.**      
34060 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67   Enables the log
34070 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65  ging of error me
34080 73 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f  ssages during ho
34090 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20  st id file.**   
340a0 20 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e      retrieval an
340b0 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a  d creation.**.**
340c0 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a    LOCKPROXYDIR.*
340d0 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72  *.**       Overr
340e0 69 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  ides the default
340f0 20 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20   directory used 
34100 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66  for lock proxy f
34110 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  iles that.**    
34120 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74     are named aut
34130 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74  omatically via t
34140 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74  he ":auto:" sett
34150 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ing.**.**  SQLIT
34160 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
34170 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a  IR_PERMISSIONS.*
34180 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69  *.**       Permi
34190 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68  ssions to use wh
341a0 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69  en creating a di
341b0 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72  rectory for stor
341c0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
341d0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
341e0 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  s, only used whe
341f0 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69  n LOCKPROXYDIR i
34200 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20  s not set..**   
34210 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d   .**    .** As m
34220 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20  entioned above, 
34230 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69  when compiled wi
34240 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  th SQLITE_PREFER
34250 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a  _PROXY_LOCKING,.
34260 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  ** setting the e
34270 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
34280 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45  ble SQLITE_FORCE
34290 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74  _PROXY_LOCKING t
342a0 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63  o 1 will.** forc
342b0 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
342c0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
342d0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69  very database fi
342e0 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30  le opened, and 0
342f0 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  .** will force a
34300 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c  utomatic proxy l
34310 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73  ocking to be dis
34320 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61  abled for all da
34330 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20  tabase.** files 
34340 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c 6c 69  (explicity calli
34350 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45  ng the SQLITE_SE
34360 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
34370 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c  pragma or.** sql
34380 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ite_file_control
34390 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65   API is not affe
343a0 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46  cted by SQLITE_F
343b0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
343c0 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  NG)..*/../*.** P
343d0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
343e0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
343f0 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66  n MacOSX .*/.#if
34400 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
34410 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
34420 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
34430 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  LE../*.** The pr
34440 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34450 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20 61  t has the path a
34460 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  nd file structur
34470 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74  es for the remot
34480 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20  e .** and local 
34490 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69  proxy files in i
344a0 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
344b0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
344c0 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63  Context proxyLoc
344d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
344e0 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  uct proxyLocking
344f0 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78  Context {.  unix
34500 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b  File *conchFile;
34510 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
34520 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
34530 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65   char *conchFile
34540 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a  Path;         /*
34550 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
34560 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  ch file */.  uni
34570 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
34580 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
34590 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  n proxy lock fil
345a0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63  e */.  char *loc
345b0 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20  kProxyPath;     
345c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
345d0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
345e0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62  le */.  char *db
345f0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
34600 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
34610 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
34620 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64  .  int conchHeld
34630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34640 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63  /* 1 if the conc
34650 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66  h is held, -1 if
34660 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76   lockless */.  v
34670 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
34680 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
34690 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
346a0 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
346b0 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
346c0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
346d0 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
346e0 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
346f0 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
34700 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
34710 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
34720 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
34730 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
34740 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
34750 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
34760 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
34770 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
34780 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
34790 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
347a0 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
347b0 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
347c0 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
347d0 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
347e0 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
347f0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
34800 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
34810 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
34820 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
34830 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
34840 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
34850 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
34860 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
34870 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
34880 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
34890 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
348a0 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
348b0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
348c0 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
348d0 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
348e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
348f0 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
34900 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
34910 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
34920 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
34930 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64 28 29   errno, getpid()
34940 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
34950 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
34960 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  CK;.    }.    le
34970 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
34980 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73  h, "sqliteplocks
34990 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a  ", maxLen);    .
349a0 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e    }.# else.  len
349b0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
349c0 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65  , "/tmp/", maxLe
349d0 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  n);.# endif.#end
349e0 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b  if..  if( lPath[
349f0 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20  len-1]!='/' ){. 
34a00 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
34a10 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78  (lPath, "/", max
34a20 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  Len);.  }.  .  /
34a30 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * transform the 
34a40 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69  db path to a uni
34a50 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a  que cache name *
34a60 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74  /.  dbLen = (int
34a70 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b  )strlen(dbPath);
34a80 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64  .  for( i=0; i<d
34a90 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37  bLen && (i+len+7
34aa0 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69  )<(int)maxLen; i
34ab0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20  ++){.    char c 
34ac0 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  = dbPath[i];.   
34ad0 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20   lPath[i+len] = 
34ae0 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a  (c=='/')?'_':c;.
34af0 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65    }.  lPath[i+le
34b00 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63  n]='\0';.  strlc
34b10 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f  at(lPath, ":auto
34b20 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f  :", maxLen);.  O
34b30 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
34b40 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b  PATH  proxy lock
34b50 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
34b60 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69  n", lPath, getpi
34b70 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
34b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
34b90 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68   . ** Creates th
34ba0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20  e lock file and 
34bb0 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65  any missing dire
34bc0 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50  ctories in lockP
34bd0 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ath. */.static i
34be0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f  nt proxyCreateLo
34bf0 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
34c00 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20  r *lockPath){.  
34c10 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68  int i, len;.  ch
34c20 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45  ar buf[MAXPATHLE
34c30 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20  N];.  int start 
34c40 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  = 0;.  .  assert
34c50 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29  (lockPath!=NULL)
34c60 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72  ;.  /* try to cr
34c70 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74  eate all the int
34c80 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74  ermediate direct
34c90 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d  ories */.  len =
34ca0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63   (int)strlen(loc
34cb0 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d  kPath);.  buf[0]
34cc0 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a   = lockPath[0];.
34cd0 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65    for( i=1; i<le
34ce0 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66  n; i++ ){.    if
34cf0 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d  ( lockPath[i] ==
34d00 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61   '/' && (i - sta
34d10 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20  rt > 0) ){.     
34d20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69   /* only mkdir i
34d30 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e  f leaf dir != ".
34d40 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22  " or "/" or ".."
34d50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d   */.      if( i-
34d60 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74  start>2 || (i-st
34d70 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74  art==1 && buf[st
34d80 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
34d90 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27  uf[start] != '/'
34da0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ) .         || (
34db0 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75  i-start==2 && bu
34dc0 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
34dd0 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20  && buf[start+1] 
34de0 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  != '.') ){.     
34df0 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a     buf[i]='\0';.
34e00 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b          if( osMk
34e10 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f  dir(buf, SQLITE_
34e20 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52  DEFAULT_PROXYDIR
34e30 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b  _PERMISSIONS) ){
34e40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65  .          int e
34e50 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
34e60 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58      if( err!=EEX
34e70 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20  IST ) {.        
34e80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52      OSTRACE(("CR
34e90 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41  EATELOCKPATH  FA
34ea0 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73  ILED creating %s
34eb0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
34ec0 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70           "'%s' p
34ed0 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
34ee0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  s pid=%d\n",.   
34ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f00 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28    buf, strerror(
34f10 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  err), lockPath, 
34f20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 20 20  getpid()));.    
34f30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
34f40 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
34f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34f60 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
34f70 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
34f80 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
34f90 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
34fa0 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
34fb0 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
34fc0 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
34fd0 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69   lockPath, getpi
34fe0 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  d()));.  return 
34ff0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
35000 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
35010 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
35020 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
35030 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
35040 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
35050 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
35060 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
35070 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
35080 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
35090 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
350a0 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
350b0 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
350c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
350d0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
350e0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
350f0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
35100 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
35110 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
35120 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
35130 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
35140 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
35150 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
35160 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
35170 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
35180 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
35190 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
351a0 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
351b0 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
351c0 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
351d0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
351e0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
351f0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
35200 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
35210 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
35220 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
35230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35240 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
35250 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
35260 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
35270 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
35280 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
35290 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
352a0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
352b0 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
352c0 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
352d0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
352e0 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
352f0 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
35300 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
35310 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
35320 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
35330 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
35340 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
35350 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
35360 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
35370 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
35380 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
35390 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
353a0 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
353b0 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
353c0 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
353d0 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
353e0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
353f0 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
35400 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
35410 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
35420 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
35430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
35440 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
35450 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
35460 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66  Unused));.    if
35470 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
35480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35490 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
354a0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
354b0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
354c0 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
354d0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
354e0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
354f0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
35500 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
35510 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
35520 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
35530 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
35540 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
35550 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72  {.        fd = r
35560 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
35570 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a   openFlags, 0);.
35580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35590 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
355a0 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
355b0 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
355c0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
355d0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
355e0 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  0);.    terrno =
355f0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
35600 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66  ( fd<0 ){.    if
35610 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  ( islockfile ){.
35620 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35630 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
35640 20 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72      switch (terr
35650 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65  no) {.      case
35660 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20   EACCES:.       
35670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
35680 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20  ERM;.      case 
35690 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65  EIO: .        re
356a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
356b0 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20  R_LOCK; /* even 
356c0 74 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65  though it is the
356d0 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20   conch */.      
356e0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
356f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35700 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
35710 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65    }.  }.  .  pNe
35720 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
35730 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
35740 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
35750 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
35760 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
35770 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
35780 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
35790 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
357a0 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
357b0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
357c0 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
357d0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d  = openFlags;.  m
357e0 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c  emset(&dummyVfs,
357f0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
35800 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66  Vfs));.  dummyVf
35810 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
35820 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
35830 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66  inder;.  dummyVf
35840 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79  s.zName = "dummy
35850 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64  ";.  pUnused->fd
35860 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64   = fd;.  pUnused
35870 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  ->flags = openFl
35880 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e  ags;.  pNew->pUn
35890 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
358a0 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
358b0 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
358c0 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33  fs, fd, (sqlite3
358d0 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
358e0 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  h, 0);.  if( rc=
358f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35900 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
35910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
35920 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
35930 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
35940 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65   .  robust_close
35950 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e  (pNew, fd, __LIN
35960 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E__);.  sqlite3_
35970 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
35980 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
35990 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
359a0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
359b0 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
359c0 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
359d0 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
359e0 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
359f0 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
35a00 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
35a10 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
35a20 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
35a30 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
35a40 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
35a50 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f   id length */../
35a60 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66  * Not always def
35a70 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ined in the head
35a80 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20  ers as it ought 
35a90 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20  to be */.extern 
35aa0 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28  int gethostuuid(
35ab0 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74  uuid_t id, const
35ac0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
35ad0 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74   *wait);../* get
35ae0 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61   the host ID via
35af0 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20   gethostuuid(), 
35b00 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69  pHostID must poi
35b10 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54  nt to PROXY_HOST
35b20 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20  IDLEN .** bytes 
35b30 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  of writable memo
35b40 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
35b50 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  t proxyGetHostID
35b60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
35b70 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45  pHostID, int *pE
35b80 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rror){.  assert(
35b90 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
35ba0 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
35bb0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
35bc0 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
35bd0 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64  OSTIDLEN);.#if d
35be0 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f  efined(__MAX_OS_
35bf0 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
35c00 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20 20 20  QUIRED)\.       
35c10 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d 41 43          && __MAC
35c20 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
35c30 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35 30 0a  N_REQUIRED<1050.
35c40 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63    {.    static c
35c50 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d 65  onst struct time
35c60 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b  spec timeout = {
35c70 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20  1, 0}; /* 1 sec 
35c80 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69  timeout */.    i
35c90 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28 70  f( gethostuuid(p
35ca0 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74  HostID, &timeout
35cb0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ) ){.      int e
35cc0 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
35cd0 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
35ce0 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20          *pError 
35cf0 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  = err;.      }. 
35d00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35d10 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
35d20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53    }.#else.  UNUS
35d30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72  ED_PARAMETER(pEr
35d40 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ror);.#endif.#if
35d50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
35d60 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75    /* simulate mu
35d70 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20  ltiple hosts by 
35d80 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20  creating unique 
35d90 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68  hostid file path
35da0 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  s */.  if( sqlit
35db0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d  e3_hostid_num !=
35dc0 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44   0){.    pHostID
35dd0 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f  [0] = (char)(pHo
35de0 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29  stID[0] + (char)
35df0 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  (sqlite3_hostid_
35e00 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20  num & 0xFF));.  
35e10 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65  }.#endif.  .  re
35e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35e30 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20  }../* The conch 
35e40 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
35e50 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69  e header, host i
35e60 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20  d and lock file 
35e70 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  path. */.#define
35e80 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53   PROXY_CONCHVERS
35e90 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74  ION 2   /* 1-byt
35ea0 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74  e header, 16-byt
35eb0 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20  e host id, path 
35ec0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
35ed0 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20  _HEADERLEN    1 
35ee0 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
35ef0 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f  header length */
35f00 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50  .#define PROXY_P
35f10 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f  ATHINDEX    (PRO
35f20 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f  XY_HEADERLEN+PRO
35f30 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64  XY_HOSTIDLEN).#d
35f40 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43  efine PROXY_MAXC
35f50 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f  ONCHLEN  (PROXY_
35f60 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
35f70 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54  HOSTIDLEN+MAXPAT
35f80 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61  HLEN)../* .** Ta
35f90 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63  kes an open conc
35fa0 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74  h file, copies t
35fb0 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61  he contents to a
35fc0 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74 68   new path and th
35fd0 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20  en moves .** it 
35fe0 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79  back.  The newly
35ff0 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73 20   created file's 
36000 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
36010 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  is assigned to t
36020 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65  he.** conch file
36030 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
36040 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69  inally the origi
36050 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  nal conch file d
36060 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a  escriptor is .**
36070 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e   closed.  Return
36080 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73  s zero if succes
36090 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sful..*/.static 
360a0 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f  int proxyBreakCo
360b0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
360c0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
360d0 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f  myHostID){.  pro
360e0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
360f0 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
36100 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
36110 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
36120 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69  ntext; .  unixFi
36130 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20  le *conchFile = 
36140 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
36150 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41  .  char tPath[MA
36160 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  XPATHLEN];.  cha
36170 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  r buf[PROXY_MAXC
36180 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72  ONCHLEN];.  char
36190 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e   *cPath = pCtx->
361a0 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20  conchFilePath;. 
361b0 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20   size_t readLen 
361c0 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61  = 0;.  size_t pa
361d0 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  thLen = 0;.  cha
361e0 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22  r errmsg[64] = "
361f0 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  ";.  int fd = -1
36200 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b  ;.  int rc = -1;
36210 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36220 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a  TER(myHostID);..
36230 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
36240 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
36250 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
36260 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
36270 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
36280 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
36290 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
362a0 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
362b0 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
362c0 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
362d0 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
362e0 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
362f0 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
36300 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  = 5) ){.    sqli
36310 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36320 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
36330 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28  sg,"path error (
36340 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61  len %d)",(int)pa
36350 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  thLen);.    goto
36360 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36370 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68    }.  /* read th
36380 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20  e conch content 
36390 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f  */.  readLen = o
363a0 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65  sPread(conchFile
363b0 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f  ->h, buf, PROXY_
363c0 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
363d0 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50  .  if( readLen<P
363e0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29  ROXY_PATHINDEX )
363f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
36400 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
36410 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65  rmsg),errmsg,"re
36420 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64  ad error (len %d
36430 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29  )",(int)readLen)
36440 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
36450 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
36460 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75 74 20  /* write it out 
36470 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
36480 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20   break file */. 
36490 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
364a0 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52  n(tPath, (O_RDWR
364b0 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29  |O_CREAT|O_EXCL)
364c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  , 0);.  if( fd<0
364d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
364e0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
364f0 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
36500 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20   "create failed 
36510 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
36520 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
36530 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
36540 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20 62 75   osPwrite(fd, bu
36550 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21  f, readLen, 0) !
36560 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c  = (ssize_t)readL
36570 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
36580 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36590 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
365a0 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64  g, "write failed
365b0 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
365c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
365d0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  aklock;.  }.  if
365e0 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20  ( rename(tPath, 
365f0 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71  cPath) ){.    sq
36600 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36610 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
36620 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66  rrmsg, "rename f
36630 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
36640 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
36650 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
36660 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72  .  rc = 0;.  fpr
36670 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 62 72  intf(stderr, "br
36680 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  oke stale lock o
36690 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b  n %s\n", cPath);
366a0 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28  .  robust_close(
366b0 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65  pFile, conchFile
366c0 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
366d0 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d    conchFile->h =
366e0 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65   fd;.  conchFile
366f0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  ->openFlags = O_
36700 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
36710 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a  .end_breaklock:.
36720 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36730 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
36740 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74     osUnlink(tPat
36750 68 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  h);.      robust
36760 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64  _close(pFile, fd
36770 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
36780 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73   }.    fprintf(s
36790 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74  tderr, "failed t
367a0 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f  o break stale lo
367b0 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c  ck on %s, %s\n",
367c0 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b   cPath, errmsg);
367d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
367e0 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65  ;.}../* Take the
367f0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
36800 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  on the conch fil
36810 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74  e and break a st
36820 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  ale lock if the 
36830 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63  .** host id matc
36840 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hes..*/.static i
36850 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63  nt proxyConchLoc
36860 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  k(unixFile *pFil
36870 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74  e, uuid_t myHost
36880 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  ID, int lockType
36890 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
368a0 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
368b0 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
368c0 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
368d0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
368e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
368f0 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
36900 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  nchFile;.  int r
36910 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36920 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b   int nTries = 0;
36930 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
36940 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b  ec conchModTime;
36950 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  .  .  memset(&co
36960 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73  nchModTime, 0, s
36970 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69  izeof(conchModTi
36980 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  me));.  do {.   
36990 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
369a0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
369b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
369c0 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
369d0 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20  pe);.    nTries 
369e0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ++;.    if( rc==
369f0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
36a00 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c       /* If the l
36a10 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79  ock failed (busy
36a20 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20  ):.       * 1st 
36a30 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64  try: get the mod
36a40 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   time of the con
36a50 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e  ch, wait 0.5s an
36a60 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20  d try again. .  
36a70 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20       * 2nd try: 
36a80 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20  fail if the mod 
36a90 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20  time changed or 
36aa0 68 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65  host id is diffe
36ab0 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20  rent, wait .    
36ac0 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31     *           1
36ad0 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67  0 sec and try ag
36ae0 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64  ain.       * 3rd
36af0 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20   try: break the 
36b00 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20  lock unless the 
36b10 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61  mod time has cha
36b20 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  nged..       */.
36b30 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
36b40 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28  t buf;.      if(
36b50 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69   osFstat(conchFi
36b60 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
36b70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
36b80 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
36b90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
36ba0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
36bb0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
36bc0 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
36bd0 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
36be0 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
36bf0 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
36c00 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
36c10 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
36c20 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
36c30 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
36c40 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
36c50 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
36c60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
36c70 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
36c80 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
36c90 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
36ca0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
36cb0 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
36cc0 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
36cd0 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
36ce0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
36cf0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
36d00 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
36d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
36d20 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
36d30 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
36d40 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
36d50 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
36d60 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
36d70 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
36d80 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f  le->h, tBuf, PRO
36d90 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
36da0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
36db0 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
36dc0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
36dd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
36de0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36df0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
36e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36e10 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59     if( len>PROXY
36e20 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74 42  _PATHINDEX && tB
36e30 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f  uf[0]==(char)PRO
36e40 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29  XY_CONCHVERSION)
36e50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
36e60 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
36e70 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20  ock if the host 
36e80 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  id doesn't match
36e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
36ea0 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75  ( 0!=memcmp(&tBu
36eb0 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  f[PROXY_HEADERLE
36ec0 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52  N], myHostID, PR
36ed0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29  OXY_HOSTIDLEN) )
36ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
36ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
36f00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36f10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36f20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
36f30 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f  break the lock o
36f40 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20  n short read or 
36f50 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74  a version mismat
36f60 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
36f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
36f80 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
36f90 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30        usleep(100
36fa0 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
36fb0 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20 74  10 sec and try t
36fc0 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f  he lock again */
36fd0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
36fe0 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e; .      }.    
36ff0 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
37000 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20   nTries==3 );.  
37010 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79      if( 0==proxy
37020 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70  BreakConchLock(p
37030 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20  File, myHostID) 
37040 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
37050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
37060 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
37070 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
37080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
37090 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
370a0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
370b0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
370c0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43  File, SHARED_LOC
370d0 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20  K);          .  
370e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
370f0 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
37100 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46       rc = conchF
37110 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c  ile->pMethod->xL
37120 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock((sqlite3_fil
37130 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f  e*)conchFile, lo
37140 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20  ckType);.       
37150 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
37160 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d  .  } while( rc==
37170 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e  SQLITE_BUSY && n
37180 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20  Tries<3 );.  .  
37190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
371a0 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68   Takes the conch
371b0 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61   by taking a sha
371c0 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61  red lock and rea
371d0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63  d the contents c
371e0 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63  onch, if .** loc
371f0 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c  kPath is non-NUL
37200 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  L, the host ID a
37210 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
37220 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41  h must match.  A
37230 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61   NULL .** lockPa
37240 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  th means that th
37250 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68  e lockPath in th
37260 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
37270 6c 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  l be used if the
37280 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61   .** host IDs ma
37290 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f  tch, or a new lo
372a0 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20  ck path will be 
372b0 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61  generated automa
372c0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20  tically .** and 
372d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
372e0 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  onch file..*/.st
372f0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61  atic int proxyTa
37300 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65  keConch(unixFile
37310 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78   *pFile){.  prox
37320 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
37330 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f  *pCtx = (proxyLo
37340 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70  ckingContext *)p
37350 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
37360 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20  text; .  .  if( 
37370 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21  pCtx->conchHeld!
37380 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
37390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
373a0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  lse{.    unixFil
373b0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70  e *conchFile = p
373c0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a  Ctx->conchFile;.
373d0 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73      uuid_t myHos
373e0 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72  tID;.    int pEr
373f0 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ror = 0;.    cha
37400 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f  r readBuf[PROXY_
37410 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
37420 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b    char lockPath[
37430 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20  MAXPATHLEN];.   
37440 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50   char *tempLockP
37450 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ath = NULL;.    
37460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37470 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61  OK;.    int crea
37480 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20  teConch = 0;.   
37490 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68   int hostIdMatch
374a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
374b0 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69  adLen = 0;.    i
374c0 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  nt tryOldLockPat
374d0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  h = 0;.    int f
374e0 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
374f0 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53  = 0;.    .    OS
37500 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f 4e 43  TRACE(("TAKECONC
37510 48 20 20 25 64 20 66 6f 72 20 25 73 20 70 69 64  H  %d for %s pid
37520 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c  =%d\n", conchFil
37530 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
37540 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
37550 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
37560 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
37570 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69  ":auto:"), getpi
37580 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d  d()));..    rc =
37590 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
375a0 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72 72 6f  myHostID, &pErro
375b0 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  r);.    if( (rc&
375c0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
375d0 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ERR ){.      pFi
375e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
375f0 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f  pError;.      go
37600 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
37620 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
37630 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c  pFile, myHostID,
37640 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
37650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
37670 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72  ;.    }.    /* r
37690 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  ead the existing
376a0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
376b0 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65     readLen = see
376c0 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
376d0 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30  le*)conchFile, 0
376e0 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59  , readBuf, PROXY
376f0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20  _MAXCONCHLEN);. 
37700 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30     if( readLen<0
37710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f   ){.      /* I/O
37720 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e   error: lastErrn
37730 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
37740 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 70 46  Read */.      pF
37750 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
37760 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74   conchFile->last
37770 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
37780 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
37790 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  EAD;.      goto 
377a0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
377b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61     }else if( rea
377c0 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41  dLen<=(PROXY_HEA
377d0 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
377e0 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20  TIDLEN) || .    
377f0 20 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66           readBuf
37800 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59  [0]!=(char)PROXY
37810 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b  _CONCHVERSION ){
37820 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72  .      /* a shor
37830 74 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f  t read or versio
37840 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63  n format mismatc
37850 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  h means we need 
37860 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
37870 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20  .      ** conch 
37880 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  file. .      */.
37890 20 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63        createConc
378a0 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  h = 1;.    }.   
378b0 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20   /* if the host 
378c0 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74  id matches and t
378d0 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72  he lock path alr
378e0 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74  eady exists in t
378f0 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20  he conch.    ** 
37900 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75 73 65  we'll try to use
37910 20 74 68 65 20 70 61 74 68 20 74 68 65 72 65 2c   the path there,
37920 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f 70 65   if we can't ope
37930 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77 65 27  n that path, we'
37940 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79  ll .    ** retry
37950 20 77 69 74 68 20 61 20 6e 65 77 20 61 75 74 6f   with a new auto
37960 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74 68 20  -generated path 
37970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
37980 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e   /* in case we n
37990 65 65 64 20 74 6f 20 74 72 79 20 61 67 61 69 6e  eed to try again
379a0 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e   for an :auto: n
379b0 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  amed lock file *
379c0 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 63 72  /..      if( !cr
379d0 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21 66 6f  eateConch && !fo
379e0 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29  rceNewLockPath )
379f0 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74 49 64  {.        hostId
37a00 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28  Match = !memcmp(
37a10 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 48  &readBuf[PROXY_H
37a20 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
37a30 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tID, .          
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a50 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f 48 4f          PROXY_HO
37a60 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20  STIDLEN);.      
37a70 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
37a80 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d 70 61  h has data compa
37a90 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
37aa0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
37ab0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37ac0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ath ){.         
37ad0 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d   /* for auto-nam
37ae0 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69  ed local lock fi
37af0 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b 20 74  le, just check t
37b00 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 77  he host ID and w
37b10 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  e'll.           
37b20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63 61 6c  ** use the local
37b30 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
37b40 74 68 61 74 27 73 20 61 6c 72 65 61 64 79 20 69  that's already i
37b50 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  n there.        
37b60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
37b70 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 20  if( hostIdMatch 
37b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
37b90 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
37ba0 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59  (readLen - PROXY
37bb0 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20 20 20  _PATHINDEX);.   
37bc0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
37bd0 20 20 20 20 20 20 69 66 28 20 70 61 74 68 4c 65        if( pathLe
37be0 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b  n>=MAXPATHLEN ){
37bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
37c00 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45  athLen=MAXPATHLE
37c10 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  N-1;.           
37c20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
37c30 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20  emcpy(lockPath, 
37c40 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50  &readBuf[PROXY_P
37c50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c  ATHINDEX], pathL
37c60 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
37c70 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68 4c 65   lockPath[pathLe
37c80 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
37c90 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68      tempLockPath
37ca0 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20   = lockPath;.   
37cb0 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
37cc0 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20 20 20  ockPath = 1;.   
37cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61           /* crea
37ce0 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
37cf0 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20 74 68   lock path if th
37d00 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e  e conch is taken
37d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
37d20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
37d30 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ch;.          }.
37d40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
37d50 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a 20 20  ( hostIdMatch.  
37d60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
37d70 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c  !strncmp(pCtx->l
37d80 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 26 72  ockProxyPath, &r
37d90 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54  eadBuf[PROXY_PAT
37da0 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20 20 20  HINDEX],.       
37db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37dc0 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58      readLen-PROX
37dd0 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20 20 20  Y_PATHINDEX).   
37de0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
37df0 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20    /* conch host 
37e00 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61  and lock path ma
37e10 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
37e20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
37e30 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  nch; .        }.
37e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
37e50 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63       /* if the c
37e60 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69 74 61  onch isn't writa
37e70 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27 74 20  ble and doesn't 
37e80 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27 74 20  match, we can't 
37e90 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  take it */.     
37ea0 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d   if( (conchFile-
37eb0 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57  >openFlags&O_RDW
37ec0 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  R) == 0 ){.     
37ed0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
37ee0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  USY;.        got
37ef0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
37f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37f10 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65 72 20        /* either 
37f20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e 27 74  the conch didn't
37f30 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e 65 65   match or we nee
37f40 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
37f50 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  w one */.      i
37f60 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
37f70 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
37f80 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50     proxyGetLockP
37f90 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61 74 68  ath(pCtx->dbPath
37fa0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  , lockPath, MAXP
37fb0 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
37fc0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
37fd0 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
37fe0 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 63 6f    /* create a co
37ff0 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70  py of the lock p
38000 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68  ath _only_ if th
38010 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e  e conch is taken
38020 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
38030 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70 64 61    .      /* upda
38040 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20 68 6f  te conch with ho
38050 73 74 20 61 6e 64 20 70 61 74 68 20 28 74 68 69  st and path (thi
38060 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f  s will fail if o
38070 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
38080 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68 61 72     ** has a shar
38090 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29  ed lock already)
380a0 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  , if the host id
380b0 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20 74 68   matches, use th
380c0 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a 20 73  e big.      ** s
380d0 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tick..      */. 
380e0 20 20 20 20 20 66 75 74 69 6d 65 73 28 63 6f 6e       futimes(con
380f0 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29  chFile->h, NULL)
38100 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f 73 74  ;.      if( host
38110 49 64 4d 61 74 63 68 20 26 26 20 21 63 72 65 61  IdMatch && !crea
38120 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
38130 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69 6c 65     if( conchFile
38140 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63  ->pInode && conc
38150 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  hFile->pInode->n
38160 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
38170 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
38180 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
38190 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
381a0 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
381b0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  in this.        
381c0 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
381d0 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
381e0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
381f0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
38200 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
38210 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
38220 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20   {          .   
38230 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
38240 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
38250 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c  , myHostID, EXCL
38260 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
38270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
38280 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
38290 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
382a0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
382b0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
382c0 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ile, EXCLUSIVE_L
382d0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
382e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
382f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38300 20 63 68 61 72 20 77 72 69 74 65 42 75 66 66 65   char writeBuffe
38310 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  r[PROXY_MAXCONCH
38320 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
38330 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b  t writeSize = 0;
38340 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
38350 20 20 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d    writeBuffer[0]
38360 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43   = (char)PROXY_C
38370 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20  ONCHVERSION;.   
38380 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69       memcpy(&wri
38390 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48  teBuffer[PROXY_H
383a0 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73  EADERLEN], myHos
383b0 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  tID, PROXY_HOSTI
383c0 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69  DLEN);.        i
383d0 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  f( pCtx->lockPro
383e0 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a  xyPath!=NULL ){.
383f0 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70            strlcp
38400 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  y(&writeBuffer[P
38410 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
38420 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
38430 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
38440 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
38450 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
38460 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
38470 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
38480 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c  ], tempLockPath,
38490 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
384a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
384b0 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58  writeSize = PROX
384c0 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74  Y_PATHINDEX + st
384d0 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66 66 65  rlen(&writeBuffe
384e0 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  r[PROXY_PATHINDE
384f0 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  X]);.        rob
38500 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 63 6f  ust_ftruncate(co
38510 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74  nchFile->h, writ
38520 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
38530 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
38540 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
38550 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42  onchFile, writeB
38560 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65  uffer, writeSize
38570 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73  , 0);.        fs
38580 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ync(conchFile->h
38590 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
385a0 20 77 65 20