/ Hex Artifact Content
Login

Artifact f86cd628ffb9ccf3adcc5c15b02c00a64eaf598e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 20 20 69  HUNK_SIZE */.  i
1e40: 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20  nt nFetchOut;   
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e70: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1e80: 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c  ch refs */.  sql
1e90: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1ea0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1eb0: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
1ec0: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1ed0: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1ee0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ef0: 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
1f00: 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65    /* Actual size
1f10: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1f20: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1f30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1f40: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20  pSizeMax;       
1f50: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1f60: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1f70: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64   value */.  void
1f80: 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20   *pMapRegion;   
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
1fb0: 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 69 66 64 65   region */.#ifde
1fc0: 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69  f __QNXNTO__.  i
1fd0: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63     /* Device sec
2000: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
2010: 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65  t deviceCharacte
2020: 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20  ristics;        
2030: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64    /* Precomputed
2040: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
2050: 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e 64 69  ristics */.#endi
2060: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
2070: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2080: 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  E.  int openFlag
2090: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
20b0: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61  lags specified a
20c0: 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64  t open() */.#end
20d0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
20e0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
20f0: 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  LE || defined(__
2100: 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67  APPLE__).  unsig
2110: 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20  ned fsFlags;    
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2130: 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73  * cached details
2140: 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a   from statfs() *
2150: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
2160: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
2170: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
2180: 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  pId;          /*
2190: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
21a0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
21b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
21c0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  /* The next grou
21d0: 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61  p of variables a
21e0: 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b  re used to track
21f0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2200: 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  the.  ** transac
2210: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20  tion counter in 
2220: 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64  bytes 24-27 of d
2230: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
2240: 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77  e updated.  ** w
2250: 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74  henever any part
2260: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2270: 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73   changes.  An as
2280: 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
2290: 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66  ll.  ** occur if
22a0: 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74   a file is updat
22b0: 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20  ed without also 
22c0: 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61  updating the tra
22d0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
22e0: 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73  unter.  This tes
22f0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f  t is made to avo
2300: 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20  id new problems 
2310: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
2320: 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65   ** one describe
2330: 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38  d by ticket #358
2340: 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67  4. .  */.  unsig
2350: 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e  ned char transCn
2360: 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75  trChng;   /* Tru
2370: 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
2380: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61  tion counter cha
2390: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
23a0: 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65  ed char dbUpdate
23b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
23c0: 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
23d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
23e0: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
23f0: 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61  ned char inNorma
2400: 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75  lWrite;   /* Tru
2410: 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  e if in a normal
2420: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
2430: 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66   */..#endif..#if
2440: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2450: 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64    /* In test mod
2460: 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  e, increase the 
2470: 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72  size of this str
2480: 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20  ucture a bit so 
2490: 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73  that .  ** it is
24a0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
24b0: 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c   struct CrashFil
24c0: 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73  e defined in tes
24d0: 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  t6.c..  */.  cha
24e0: 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a  r aPadding[32];.
24f0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
2500: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
2510: 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65  for the unixFile
2520: 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61  .ctrlFlags bitma
2530: 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  sk:.*/.#define U
2540: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20  NIXFILE_EXCL    
2550: 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20      0x01     /* 
2560: 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  Connections from
2570: 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c   one process onl
2580: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
2590: 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20  XFILE_RDONLY    
25a0: 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f    0x02     /* Co
25b0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64  nnection is read
25c0: 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65   only */.#define
25d0: 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53   UNIXFILE_PERSIS
25e0: 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f  T_WAL 0x04     /
25f0: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2600: 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66   mode */.#ifndef
2610: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2620: 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  DIRSYNC.# define
2630: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2640: 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a  C    0x08     /*
2650: 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   Directory sync 
2660: 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a  needed */.#else.
2670: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2680: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2690: 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  0.#endif.#define
26a0: 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20   UNIXFILE_PSOW  
26b0: 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f        0x10     /
26c0: 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  * SQLITE_IOCAP_P
26d0: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
26e0: 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  TE */.#define UN
26f0: 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20  IXFILE_DELETE   
2700: 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44     0x20     /* D
2710: 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  elete on close *
2720: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2730: 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30  LE_URI         0
2740: 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e  x40     /* Filen
2750: 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71  ame might have q
2760: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
2770: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2780: 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20  ILE_NOLOCK      
2790: 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e  0x80     /* Do n
27a0: 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a  o file locking *
27b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
27c0: 4c 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30  LE_WARNED    0x0
27d0: 31 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66  100     /* verif
27e0: 79 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e  yDbFile() warnin
27f0: 67 73 20 68 61 76 65 20 62 65 65 6e 20 69 73 73  gs have been iss
2800: 75 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ued */../*.** In
2810: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2820: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2830: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2840: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2850: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2860: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
2870: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
2880: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
2890: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
28a0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
28b0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
28c0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
28d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
28e0: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
28f0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2900: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2910: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2920: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2930: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2940: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2950: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2960: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
2970: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2980: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
2990: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
29a0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
29b0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
29c0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
29d0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
29e0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
29f0: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2a00: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2a10: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2a20: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2a30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2a40: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2a50: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2a60: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
2a70: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
2a80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
2a90: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
2aa0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
2ab0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
2ac0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2ad0: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2ae0: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2af0: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2b00: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2b10: 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ./*.** Different
2b20: 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65   Unix systems de
2b30: 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20  clare open() in 
2b40: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20  different ways. 
2b50: 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65   Same use.** ope
2b60: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2b70: 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65  t,mode_t).  Othe
2b80: 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73  rs use open(cons
2b90: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29  t char*,int,...)
2ba0: 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
2bb0: 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  nce is important
2bc0: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f   when using a po
2bd0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
2be0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
2bf0: 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64   safest way to d
2c00: 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f  eal with the pro
2c10: 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79  blem is to alway
2c20: 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70  s use this wrapp
2c30: 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61  er.** which alwa
2c40: 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ys has the same 
2c50: 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74  well-defined int
2c60: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
2c70: 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28  c int posixOpen(
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c90: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
2ca0: 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  t mode){.  retur
2cb0: 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c  n open(zFile, fl
2cc0: 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f  ags, mode);.}../
2cd0: 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73  *.** On some sys
2ce0: 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66  tems, calls to f
2cf0: 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69  chown() will tri
2d00: 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20 69  gger a message i
2d10: 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20  n a security.** 
2d20: 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65  log if they come
2d30: 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70   from non-root p
2d40: 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76  rocesses.  So av
2d50: 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f  oid calling fcho
2d60: 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72  wn() if.** we ar
2d70: 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73  e not running as
2d80: 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   root..*/.static
2d90: 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f 77 6e   int posixFchown
2da0: 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75  (int fd, uid_t u
2db0: 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a  id, gid_t gid){.
2dc0: 20 20 72 65 74 75 72 6e 20 67 65 74 65 75 69 64    return geteuid
2dd0: 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77 6e 28  () ? 0 : fchown(
2de0: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a  fd,uid,gid);.}..
2df0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
2e00: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
2e10: 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
2e20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e  (const char*, in
2e30: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  t*);../*.** Many
2e40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2e50: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2e60: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2e70: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2e80: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2e90: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2ea0: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2eb0: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2ec0: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2ed0: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2ee0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2ef0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2f00: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2f10: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2f20: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2f30: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2f40: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2f50: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2f60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2f80: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2f90: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2fa0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
2fb0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
2fc0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2fd0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2ff0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3000: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3010: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3020: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
3030: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3040: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3050: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
3060: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
3070: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3080: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
3090: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
30a0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
30b0: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
30c0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
30d0: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
30e0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
30f0: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
3100: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
3110: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3120: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
3130: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3140: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
3150: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3160: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3170: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3180: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3190: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
31a0: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
31b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
31c0: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
31d0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
31e0: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
31f0: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3200: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
3210: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3220: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
3230: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3240: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
3250: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3260: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3270: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3280: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3290: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
32a0: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
32b0: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
32c0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
32d0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
32e0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
32f0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3300: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
3310: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
3320: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
3330: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
3340: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
3350: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
3360: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3370: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3380: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3390: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
33a0: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
33b0: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
33c0: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
33d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
33e0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
33f0: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3400: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
3410: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
3420: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3430: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
3440: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3450: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
3460: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3470: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3480: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3490: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
34a0: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
34b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
34c0: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
34d0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
34e0: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
34f0: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3500: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
3510: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
3520: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3530: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
3540: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3550: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
3560: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3570: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3580: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3590: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
35a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
35b0: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
35c0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
35d0: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
35e0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
35f0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3600: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
3610: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
3620: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
3630: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3640: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
3650: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
3660: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3670: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3680: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3690: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
36a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36b0: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
36c0: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
36d0: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
36e0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
36f0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3700: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
3710: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3720: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3730: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
3740: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
3750: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3760: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3770: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3780: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3790: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
37a0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
37b0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
37c0: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
37d0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
37e0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
37f0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3800: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
3810: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
3820: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3830: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
3840: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
3850: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
3860: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3870: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3880: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3890: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
38a0: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
38b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
38c0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
38d0: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
38e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38f0: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3900: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3910: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3920: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3930: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3940: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3950: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
3960: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3970: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3980: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
39b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
39c0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
39d0: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
39e0: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
39f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3a00: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3a10: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3a20: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3a30: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3a40: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3a50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3a60: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3a70: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3a80: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3a90: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3ab0: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3ac0: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3ad0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3ae0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3af0: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3b00: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b10: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b20: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b30: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b40: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3b50: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3b60: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3b70: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3b80: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3b90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3ba0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3bb0: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3bc0: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3bd0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3be0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3bf0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c00: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c10: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c20: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c30: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3c50: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3c60: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3c70: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3c80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3c90: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3ca0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3cb0: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3cc0: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3cd0: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3ce0: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3cf0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d00: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d10: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d20: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d30: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d40: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3d50: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3d60: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3d70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3d80: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3d90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3da0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3db0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3dc0: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3dd0: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3de0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3df0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e10: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e20: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e30: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e40: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3e50: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3e60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3e70: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3e80: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3e90: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3ea0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3eb0: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3ec0: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3ed0: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3ee0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
3ef0: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
3f00: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3f10: 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30  _ptr)mmap,     0
3f20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d   },.#define osMm
3f30: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
3f40: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
3f50: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
3f60: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3f70: 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61  ent)..  { "munma
3f80: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3f90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3fa0: 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  unmap,          
3fb0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d  0 },.#define osM
3fc0: 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  unmap ((void*(*)
3fd0: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
3fe0: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
3ff0: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
4000: 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d  MREMAP.  { "mrem
4010: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
4020: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4030: 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mremap,         
4040: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4050: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4060: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4070: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
4080: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4090: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d  f.#define osMrem
40a0: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
40b0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f  id*,size_t,size_
40c0: 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63  t,int,...))aSysc
40d0: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
40e0: 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  )..}; /* End of 
40f0: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
4100: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
4110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
4120: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
4130: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
4140: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
4150: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e  ll of the.** "un
4160: 69 78 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  ix" VFSes.  Retu
4170: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
4180: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
4190: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
41a0: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
41b0: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
41c0: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
41d0: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
41e0: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
41f0: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
4200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
4210: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  xSetSystemCall(.
4220: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
4230: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
4240: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
4250: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
4260: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4270: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
4280: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
4290: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
42a0: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
42b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
42c0: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
42d0: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
42e0: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
42f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4300: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
4310: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
4320: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4330: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
4340: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
4350: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
4360: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
4370: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
4380: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
4390: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
43a0: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
43b0: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
43c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
43d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
43e0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
43f0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4400: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4410: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4420: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
4430: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
4440: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
4450: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4460: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
4470: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
4480: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
4490: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
44a0: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
44b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
44c0: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
44d0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
44e0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
44f0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
4500: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
4510: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
4520: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
4530: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
4540: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
4550: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4560: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
4570: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4580: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
4590: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
45a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
45c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
45d0: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
45e0: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
45f0: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4600: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
4610: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
4620: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
4630: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4640: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4650: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
4660: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
4670: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
4680: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
4690: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
46a0: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
46b0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
46c0: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
46d0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
46e0: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
46f0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
4700: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
4710: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4720: 72 20 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43  r unixGetSystemC
4730: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
4740: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
4750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4760: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
4770: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
4780: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
4790: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
47a0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
47b0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
47c0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
47d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
47e0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
47f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
4800: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
4810: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
4820: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4830: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
4840: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
4850: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
4860: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
4870: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
4880: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
4890: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
48a0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
48b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
48c0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
48d0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
48e0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
48f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
4900: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
4910: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
4920: 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78  st char *unixNex
4930: 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
4940: 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73  te3_vfs *p, cons
4950: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
4960: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20    int i = -1;.. 
4970: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4980: 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  R(p);.  if( zNam
4990: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
49a0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
49b0: 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b  yscall)-1; i++){
49c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
49d0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
49e0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
49f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4a00: 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41  }.  for(i++; i<A
4a10: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
4a20: 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  l); i++){.    if
4a30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  ( aSyscall[i].pC
4a40: 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75  urrent!=0 ) retu
4a50: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  rn aSyscall[i].z
4a60: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Name;.  }.  retu
4a70: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
4a80: 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44  nvoke open().  D
4a90: 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69  o so multiple ti
4aa0: 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65 69  mes, until it ei
4ab0: 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f 72  ther succeeds or
4ac0: 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73 6f  .** fails for so
4ad0: 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72 20  me reason other 
4ae0: 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a  than EINTR..**.*
4af0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63 72  * If the file cr
4b00: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20  eation mode "m" 
4b10: 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69 74  is 0 then set it
4b20: 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
4b30: 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20  for.** SQLite.  
4b40: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 53  The default is S
4b50: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
4b60: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 28  LE_PERMISSIONS (
4b70: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34  normally.** 0644
4b80: 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79  ) as modified by
4b90: 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61 73   the system umas
4ba0: 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74 20  k.  If m is not 
4bb0: 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20  0, then.** make 
4bc0: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
4bd0: 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74 6c  n mode be exactl
4be0: 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68 65  y m ignoring the
4bf0: 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   umask..**.** Th
4c00: 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77 69  e m parameter wi
4c10: 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  ll be non-zero o
4c20: 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e  nly when creatin
4c30: 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c  g -wal, -journal
4c40: 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69  ,.** and -shm fi
4c50: 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74 68  les.  We want th
4c60: 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61 76  ose files to hav
4c70: 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65 20  e *exactly* the 
4c80: 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69  same.** permissi
4c90: 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72 69  ons as their ori
4ca0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20  ginal database, 
4cb0: 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62 79  unadulterated by
4cc0: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49   the umask..** I
4cd0: 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20 61  n that way, if a
4ce0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
4cf0: 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d  s -rw-rw-rw or -
4d00: 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a  rw-rw-r-, and a.
4d10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
4d20: 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76 65  rashes and leave
4d30: 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75  s behind hot jou
4d40: 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a  rnals, then any.
4d50: 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  ** process that 
4d60: 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65  is able to write
4d70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4d80: 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62   will also be ab
4d90: 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72  le to.** recover
4da0: 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
4db0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4dc0: 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e   robust_open(con
4dd0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
4de0: 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20  f, mode_t m){.  
4df0: 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74  int fd;.  mode_t
4e00: 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51   m2 = m ? m : SQ
4e10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
4e20: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20  E_PERMISSIONS;. 
4e30: 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
4e40: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
4e50: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
4e60: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
4e70: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
4e80: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
4e90: 6e 64 69 66 0a 20 20 7d 77 68 69 6c 65 28 20 66  ndif.  }while( f
4ea0: 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  d<0 && errno==EI
4eb0: 4e 54 52 20 29 3b 0a 20 20 69 66 28 20 66 64 3e  NTR );.  if( fd>
4ec0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
4ed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
4ee0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
4ef0: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
4f00: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
4f10: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
4f20: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
4f30: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
4f40: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
4f50: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
4f60: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
4f70: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
4f80: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
4f90: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
4fa0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
4fb0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
4fc0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
4fd0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
4fe0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
4ff0: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5000: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5020: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5030: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5040: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5050: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5060: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5070: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5080: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
5090: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
50a0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
50b0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
50c0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
50d0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
50e0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
50f0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5100: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5110: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5120: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5130: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5140: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5150: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5160: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5170: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5180: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
5190: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
51a0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
51b0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
51c0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
51d0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
51e0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
51f0: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5200: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5210: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5220: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5230: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5240: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5250: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
5260: 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ER));.}.static v
5270: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
5280: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
5290: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
52a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
52b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
52c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
52d0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
52e0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
52f0: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76   unixMutexHeld(v
5300: 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
5310: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5320: 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
5330: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5340: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
5350: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
5360: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5370: 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
5380: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5390: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
53a0: 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69  ction for printi
53b0: 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66  ng out trace inf
53c0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65  ormation from de
53d0: 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72  bugging.** binar
53e0: 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e  ies. This return
53f0: 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  s the string rep
5400: 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  resetation of th
5410: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5420: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5430: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5440: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
5450: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
5460: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
5470: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
5480: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
5490: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
54a0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
54b0: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
54c0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
54d0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
54e0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
54f0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5500: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5510: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5520: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5530: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5540: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
5550: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
5560: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5570: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
5580: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
5590: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
55a0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
55b0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
55c0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
55d0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
55e0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
55f0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
5600: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5610: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5620: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5630: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5640: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
5650: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
5660: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
5670: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
5680: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
5690: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
56a0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
56b0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
56c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
56d0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
56e0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
56f0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
5700: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5710: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5720: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5730: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5740: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5750: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5760: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5770: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
5780: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5790: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
57a0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
57b0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
57c0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
57d0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
57e0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
57f0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5800: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5810: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5820: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5830: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5840: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5850: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5860: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5870: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
5880: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
5890: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
58a0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
58b0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
58c0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
58d0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
58e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
58f0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5900: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5910: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5920: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
5930: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
5940: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
5950: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
5960: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
5970: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
5980: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
5990: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
59a0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
59b0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
59c0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
59d0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
59e0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
59f0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
5a00: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5a10: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
5a20: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
5a30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5a40: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
5a50: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5a60: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
5a70: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
5a80: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5a90: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
5aa0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
5ab0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5ac0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
5ad0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5ae0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
5af0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
5b00: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
5b10: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
5b20: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
5b30: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
5b40: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
5b50: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
5b60: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
5b70: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
5b80: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
5b90: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
5ba0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
5bb0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
5bc0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
5bd0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
5be0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f   due to EINTR.*/
5bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
5c00: 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74  st_ftruncate(int
5c10: 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   h, sqlite3_int6
5c20: 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  4 sz){.  int rc;
5c30: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
5c40: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
5c50: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
5c60: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
5c70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5c80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5c90: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
5ca0: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
5cb0: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
5cc0: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
5cd0: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
5ce0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
5cf0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
5d00: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
5d10: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
5d20: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
5d30: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
5d40: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
5d50: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
5d60: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
5d70: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
5d80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5d90: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
5da0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
5db0: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
5dc0: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
5dd0: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
5de0: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
5df0: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
5e00: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
5e10: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
5e20: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
5e30: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
5e40: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
5e50: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
5e60: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
5e70: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
5e80: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
5e90: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
5ea0: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
5eb0: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
5ec0: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
5ed0: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
5ee0: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
5ef0: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
5f00: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
5f10: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
5f20: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
5f30: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
5f40: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
5f50: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
5f60: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
5f70: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
5f80: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
5f90: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
5fa0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
5fb0: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
5fc0: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
5fd0: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
5fe0: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
5ff0: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
6000: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
6010: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
6020: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
6030: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
6040: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
6050: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
6060: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
6070: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
6080: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
6090: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
60a0: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
60b0: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
60c0: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
60d0: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
60e0: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
60f0: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
6100: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
6110: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
6120: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
6130: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
6140: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6150: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6160: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6170: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
6180: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
6190: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
61a0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
61b0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
61c0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
61d0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
61e0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
61f0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6200: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6210: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6220: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
6230: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
6240: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
6250: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
6260: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
6270: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
6280: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
6290: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62a0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62b0: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
62c0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
62d0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
62e0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c  || .        (sql
62f0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6300: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
6310: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c   ||.        (sql
6320: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6330: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6340: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
6350: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6360: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
6370: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
6380: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
6390: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
63a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
63b0: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41  ;.    .  /* EDEA
63c0: 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DLK is only poss
63d0: 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74  ible if a call t
63e0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57  o fcntl(F_SETLKW
63f0: 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20  ) is made. And. 
6400: 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   ** this module 
6410: 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68  never makes such
6420: 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65   a call. And the
6430: 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20   code in SQLite 
6440: 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73  itself .  ** ass
6450: 65 72 74 73 20 74 68 61 74 20 53 51 4c 49 54 45  erts that SQLITE
6460: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69  _IOERR_BLOCKED i
6470: 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64  s never returned
6480: 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65 61 73  . For these reas
6490: 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  ons.  ** this ca
64a0: 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  se is also comme
64b0: 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65  nted out. If the
64c0: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74   system does set
64d0: 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c   errno to EDEADL
64e0: 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61  K,.  ** the defa
64f0: 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ult SQLITE_IOERR
6500: 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62  _XXX code will b
6510: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23  e returned. */.#
6520: 69 66 20 30 0a 20 20 63 61 73 65 20 45 44 45 41  if 0.  case EDEA
6530: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
6540: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
6550: 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20  CKED;.#endif.   
6560: 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50   .#if EOPNOTSUPP
6570: 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65  !=ENOTSUP.  case
6580: 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20   EOPNOTSUPP: .  
6590: 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77    /* something w
65a0: 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77 72  ent terribly awr
65b0: 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  y, unless during
65c0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
65d0: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
65e0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
65f0: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
6600: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
6610: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ays */.#endif.#i
6620: 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63  fdef ENOTSUP.  c
6630: 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20  ase ENOTSUP: .  
6640: 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c    /* invalid fd,
6650: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6660: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6670: 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  rt introspection
6680: 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20  , in which .    
6690: 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d   * it actually m
66a0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
66b0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61  s */.#endif.  ca
66c0: 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45  se EIO:.  case E
66d0: 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e  BADF:.  case EIN
66e0: 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54  VAL:.  case ENOT
66f0: 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f  CONN:.  case ENO
6700: 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49  DEV:.  case ENXI
6710: 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54  O:.  case ENOENT
6720: 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45 20  :.#ifdef ESTALE 
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73      /* ESTALE is
6750: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20   not defined on 
6760: 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73 20  Interix systems 
6770: 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45  */.  case ESTALE
6780: 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20  :.#endif.  case 
6790: 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74  ENOSYS:.    /* t
67a0: 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63  hese should forc
67b0: 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20  e the client to 
67c0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
67d0: 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a  nd reconnect */.
67e0: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
67f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
6800: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
6810: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6830: 2a 2a 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: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6870: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
6880: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
6890: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
68a0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
68b0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
68c0: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
68d0: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
68e0: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
68f0: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
6900: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
6910: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
6920: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6930: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
6940: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
6950: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
6960: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
6970: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
6980: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
6990: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
69a0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
69b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
69c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
69d0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
69e0: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
69f0: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
6a00: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
6a10: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
6a20: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
6a30: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
6a40: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
6a50: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
6a60: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
6a70: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
6a80: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
6a90: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
6aa0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6ab0: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
6ac0: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
6ad0: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
6ae0: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
6af0: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
6b00: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
6b10: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
6b20: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
6b30: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
6b40: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
6b50: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
6b60: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
6b70: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
6b80: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
6b90: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6ba0: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
6bb0: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
6bc0: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
6bd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6c00: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
6c10: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
6c20: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
6c30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6c40: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
6c50: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
6c60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
6c70: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
6c80: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
6c90: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
6ca0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6cb0: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
6cc0: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
6cd0: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
6ce0: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
6cf0: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
6d00: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
6d10: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6d20: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
6d30: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
6d40: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
6d50: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
6d60: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
6d70: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
6d80: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
6d90: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
6da0: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
6db0: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
6dc0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
6dd0: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
6de0: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
6df0: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
6e00: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
6e10: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
6e20: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
6e30: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
6e40: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
6e50: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
6e60: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
6e70: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
6e80: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
6e90: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
6ea0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
6eb0: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
6ec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
6ed0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
6ee0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
6ef0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
6f00: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
6f10: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
6f20: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
6f30: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
6f40: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
6f50: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6f60: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
6f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
6f80: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
6f90: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
6fa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
6fb0: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6fc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6fd0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
6fe0: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
6ff0: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
7000: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
7010: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
7020: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
7030: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7040: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
7050: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
7060: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
7070: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7080: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
7090: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
70a0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
70b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
70c0: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
70d0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
70e0: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
70f0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7100: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
7110: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7120: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
7130: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
7140: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
7150: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
7160: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
7170: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7180: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
7190: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
71a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
71b0: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
71c0: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
71d0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
71e0: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
71f0: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
7200: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
7210: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7220: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
7230: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
7240: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
7250: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
7260: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
7270: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
7280: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
7290: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
72a0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
72b0: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
72c0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
72d0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
72e0: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
72f0: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
7300: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
7310: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
7320: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
7350: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
7360: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
7370: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
7380: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
7390: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
73a0: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
73b0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
73c0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
73d0: 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29  *pNew) + (n+1) )
73e0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
73f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7400: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7410: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
7420: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
7430: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
7440: 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ame, zAbsoluteNa
7450: 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20  me, n+1);.  n = 
7460: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
7470: 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ame(pNew->zCanon
7480: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20  icalName, n);.. 
7490: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
74a0: 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
74b0: 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74   that matching t
74c0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
74d0: 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64  e..  ** If found
74e0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  , increment the 
74f0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
7500: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
7510: 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65  nter to.  ** the
7520: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
7530: 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  D..  */.  unixEn
7540: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
7550: 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77  r(pCandidate=vxw
7560: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43  orksFileList; pC
7570: 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69  andidate; pCandi
7580: 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d  date=pCandidate-
7590: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
75a0: 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61   pCandidate->nNa
75b0: 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d  me==n .     && m
75c0: 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65  emcmp(pCandidate
75d0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
75e0: 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  , pNew->zCanonic
75f0: 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20  alName, n)==0.  
7600: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
7610: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
7620: 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74         pCandidat
7630: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  e->nRef++;.     
7640: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
7650: 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ();.       retur
7660: 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20  n pCandidate;.  
7670: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
7680: 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64   match was found
7690: 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20  .  We will make 
76a0: 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  a new file ID */
76b0: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
76c0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65  1;.  pNew->nName
76d0: 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = n;.  pNew->pN
76e0: 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c  ext = vxworksFil
76f0: 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73  eList;.  vxworks
7700: 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b  FileList = pNew;
7710: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7720: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  x();.  return pN
7730: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ew;.}../*.** Dec
7740: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
7750: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20  ence count on a 
7760: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
7770: 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74  ject.  Free.** t
7780: 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74  he object when t
7790: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
77a0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
77b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
77c0: 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
77d0: 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f  leId(struct vxwo
77e0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b  rksFileId *pId){
77f0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
7800: 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
7810: 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Id->nRef>0 );.  
7820: 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pId->nRef--;.  i
7830: 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20  f( pId->nRef==0 
7840: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78  ){.    struct vx
7850: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70  worksFileId **pp
7860: 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78  ;.    for(pp=&vx
7870: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a  worksFileList; *
7880: 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20  pp && *pp!=pId; 
7890: 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e  pp = &((*pp)->pN
78a0: 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65  ext)){}.    asse
78b0: 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a  rt( *pp==pId );.
78c0: 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70      *pp = pId->p
78d0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
78e0: 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d  3_free(pId);.  }
78f0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
7900: 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  x();.}.#endif /*
7910: 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
7920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
7930: 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69  End of Unique Fi
7940: 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73  le ID Utility Us
7950: 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a  ed By VxWorks **
7960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a  *************/..
79c0: 0a 2f 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 2a 2a 2a  ****************
79e0: 2a 2a 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: 0a 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 20 50 6f 73  ************ Pos
7a30: 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
7a40: 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a60: 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76  .**.** POSIX adv
7a70: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20  isory locks are 
7a80: 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e  broken by design
7a90: 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33  .  ANSI STD 1003
7aa0: 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63  .1 (1996).** sec
7ab0: 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e  tion 6.5.2.2 lin
7ac0: 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34  es 483 through 4
7ad0: 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20  90 specify that 
7ae0: 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a  when a process.*
7af0: 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73  * sets or clears
7b00: 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70   a lock, that op
7b10: 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65  eration override
7b20: 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b  s any prior lock
7b30: 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20  s set.** by the 
7b40: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49  same process.  I
7b50: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69  t does not expli
7b60: 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75  citly say so, bu
7b70: 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a  t this implies.*
7b80: 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69  * that it overri
7b90: 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79  des locks set by
7ba0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7bb0: 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72  s using a differ
7bc0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
7bd0: 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65  riptor.  Conside
7be0: 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65  r this test case
7bf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e  :.**.**       in
7c00: 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd1 = open("./
7c10: 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f  file1", O_RDWR|O
7c20: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7c30: 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20  *       int fd2 
7c40: 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22  = open("./file2"
7c50: 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
7c60: 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53  , 0644);.**.** S
7c70: 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61  uppose ./file1 a
7c80: 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72  nd ./file2 are r
7c90: 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66  eally the same f
7ca0: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
7cb0: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
7cc0: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
7cd0: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
7ce0: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
7cf0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7d00: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
7d10: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
7d20: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
7d30: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
7d40: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
7d50: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
7d60: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
7d70: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
7d80: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
7d90: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
7da0: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
7db0: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
7dc0: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
7dd0: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
7de0: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
7df0: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
7e00: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
7e10: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
7e20: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
7e30: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
7e40: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
7e50: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
7e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  .**.** This mean
7e70: 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  s that we cannot
7e80: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
7e90: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
7ea0: 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61  file access.** a
7eb0: 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74  mong competing t
7ec0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
7ed0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
7ee0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
7ef0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
7f00: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
7f10: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
7f20: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
7f30: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
7f40: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
7f50: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
7f60: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
7f70: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
7f80: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
7f90: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
7fa0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
7fb0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
7fc0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
7fd0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
7fe0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
7ff0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
8000: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
8010: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
8020: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
8030: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
8040: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
8050: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
8060: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
8070: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
8080: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
8090: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
80a0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
80b0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
80c0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
80d0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
80e0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
80f0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
8100: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
8110: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
8120: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
8130: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
8140: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
8150: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
8160: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73  inode..**.** (As
8170: 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20  ide: The use of 
8180: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73  inode numbers as
8190: 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73   unique IDs does
81a0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
81b0: 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57  orks..** For VxW
81c0: 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f  orks, we have to
81d0: 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61   use the alterna
81e0: 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73  tive unique ID s
81f0: 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a  ystem based on.*
8200: 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * canonical file
8210: 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65  name and impleme
8220: 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76  nted in the prev
8230: 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a  ious division.).
8240: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
8250: 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
8260: 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f   for POSIX is no
8270: 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20   longer just an 
8280: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
8290: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20  descriptor.  It 
82a0: 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75  is now a structu
82b0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
82c0: 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  e integer file.*
82d0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  * descriptor and
82e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
82f0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8300: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74  escribes the int
8310: 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f  ernal.** locks o
8320: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
8330: 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72  ing inode.  Ther
8340: 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67  e is one locking
8350: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65   structure.** pe
8360: 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74  r inode, so if t
8370: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73  he same inode is
8380: 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62   opened twice, b
8390: 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72  oth unixFile str
83a0: 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74  uctures.** point
83b0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63   to the same loc
83c0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  king structure. 
83d0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   The locking str
83e0: 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20  ucture keeps.** 
83f0: 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  a reference coun
8400: 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e  t (so we will kn
8410: 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74  ow when to delet
8420: 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74  e it) and a "cnt
8430: 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20  ".** field that 
8440: 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74  tells us its int
8450: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75  ernal lock statu
8460: 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73  s.  cnt==0 means
8470: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
8480: 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d  unlocked.  cnt==
8490: 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c  -1 means the fil
84a0: 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  e has an exclusi
84b0: 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e  ve lock..** cnt>
84c0: 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  0 means there ar
84d0: 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63  e cnt shared loc
84e0: 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ks on the file..
84f0: 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70  **.** Any attemp
8500: 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  t to lock or unl
8510: 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74  ock a file first
8520: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b   checks the lock
8530: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
8540: 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73  .  The fcntl() s
8550: 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e  ystem call is on
8560: 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  ly invoked to se
8570: 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f  t a .** POSIX lo
8580: 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e  ck if the intern
8590: 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72  al lock structur
85a0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65  e transitions be
85b0: 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65  tween.** a locke
85c0: 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65  d and an unlocke
85d0: 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42  d state..**.** B
85e0: 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20  ut wait:  there 
85f0: 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f  are yet more pro
8600: 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58  blems with POSIX
8610: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e   advisory locks.
8620: 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c  .**.** If you cl
8630: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
8640: 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  iptor that point
8650: 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74  s to a file that
8660: 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61   has locks,.** a
8670: 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  ll locks on that
8680: 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f   file that are o
8690: 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  wned by the curr
86a0: 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a  ent process are.
86b0: 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f  ** released.  To
86c0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
86d0: 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20  s problem, each 
86e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
86f0: 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e  ject.** maintain
8700: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
8710: 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69   number of pendi
8720: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20  ng locks on tha 
8730: 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61  inode..** When a
8740: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
8750: 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e  e to close an un
8760: 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65  ixFile, if there
8770: 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e   are.** other un
8780: 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  ixFile open on t
8790: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
87a0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
87b0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
87c0: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
87d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
87e0: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
87f0: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
8800: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
8810: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
8820: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
8830: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64  a list of file d
8840: 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20  escriptors that 
8850: 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c  need to.** be cl
8860: 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69  osed and that li
8870: 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e  st is walked (an
8880: 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20  d cleared) when 
8890: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a  the last lock.**
88a0: 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59   clears..**.** Y
88b0: 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c  et another probl
88c0: 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64  em:  LinuxThread
88d0: 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65  s do not play we
88e0: 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f  ll with posix lo
88f0: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20  cks..**.** Many 
8900: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
8910: 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20  f linux use the 
8920: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62  LinuxThreads lib
8930: 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a  rary which is.**
8940: 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c   not posix compl
8950: 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e  iant.  Under Lin
8960: 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63  uxThreads, a loc
8970: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
8980: 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20  ead.** A cannot 
8990: 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f  be modified or o
89a0: 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64  verridden by a d
89b0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
89c0: 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61  B..** Only threa
89d0: 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74  d A can modify t
89e0: 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e  he lock.  Lockin
89f0: 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f  g behavior is co
8a00: 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20  rrect.** if the 
8a10: 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20  appliation uses 
8a20: 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65  the newer Native
8a30: 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69   Posix Thread Li
8a40: 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20  brary (NPTL).** 
8a50: 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20  on linux - with 
8a60: 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61  NPTL a lock crea
8a70: 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20  ted by thread A 
8a80: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
8a90: 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20  ks.** in thread 
8aa0: 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  B.  But there is
8ab0: 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20   no way to know 
8ac0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
8ad0: 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69  which.** threadi
8ae0: 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65  ng library is be
8af0: 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68  ing used.  So th
8b00: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8b10: 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70   know at.** comp
8b20: 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72  ile-time whether
8b30: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41   or not thread A
8b40: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
8b50: 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e  cks on thread B.
8b60: 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64  .** One has to d
8b70: 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65  o a run-time che
8b80: 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  ck to discover t
8b90: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
8ba0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72  he.** current pr
8bb0: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ocess..**.** SQL
8bc0: 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70  ite used to supp
8bd0: 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73  ort LinuxThreads
8be0: 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66  .  But support f
8bf0: 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a  or LinuxThreads.
8c00: 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62  ** was dropped b
8c10: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65  eginning with ve
8c20: 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51  rsion 3.7.0.  SQ
8c30: 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  Lite will still 
8c40: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e  work with.** Lin
8c50: 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64  uxThreads provid
8c60: 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72  ed that (1) ther
8c70: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  e is no more tha
8c80: 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n one connection
8c90: 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73   .** per databas
8ca0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61  e file in the sa
8cb0: 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28  me process and (
8cc0: 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  2) database conn
8cd0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f  ections.** do no
8ce0: 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68  t move across th
8cf0: 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  reads..*/../*.**
8d00: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
8d10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
8d20: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
8d30: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
8d40: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
8d50: 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f  rticular unixIno
8d60: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
8d70: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  /.struct unixFil
8d80: 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65  eId {.  dev_t de
8d90: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
8da0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75      /* Device nu
8db0: 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56  mber */.#if OS_V
8dc0: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
8dd0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
8de0: 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66  Id;  /* Unique f
8df0: 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72  ile ID for vxwor
8e00: 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  ks. */.#else.  i
8e10: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20  no_t ino;       
8e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8e30: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65  ode number */.#e
8e40: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
8e50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
8e60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
8e70: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
8e80: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
8e90: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20  .** inode.  Or, 
8ea0: 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  on LinuxThreads,
8eb0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66   there is one of
8ec0: 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
8ed0: 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e  s for.** each in
8ee0: 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61  ode opened by ea
8ef0: 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ch thread..**.**
8f00: 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20   A single inode 
8f10: 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  can have multipl
8f20: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
8f30: 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78  rs, so each unix
8f40: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
8f50: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
8f60: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
8f70: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
8f80: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
8f90: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
8fa0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
8fb0: 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f  r of unixFile po
8fc0: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
8fd0: 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64  .struct unixInod
8fe0: 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74  eInfo {.  struct
8ff0: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
9000: 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
9010: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
9020: 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20   int nShared;   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48   /* Number of SH
9050: 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ARED locks held 
9060: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9070: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
9080: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
9090: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
90a0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
90b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
90c0: 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20  r bProcessLock; 
90d0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73      /* An exclus
90e0: 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b  ive process lock
90f0: 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e   is held */.  in
9100: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9120: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
9130: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
9140: 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53  cture */.  unixS
9150: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
9160: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ;          /* Sh
9170: 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
9180: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
9190: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
91a0: 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  nLock;          
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
91c0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
91d0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
91e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
91f0: 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20  d *pUnused;     
9200: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66       /* Unused f
9210: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
9220: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e  to close */.  un
9230: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65  ixInodeInfo *pNe
9240: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
9250: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69   List of all uni
9260: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
9270: 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ts */.  unixInod
9280: 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20  eInfo *pPrev;   
9290: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e          /*    ..
92a0: 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  .. doubly linked
92b0: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
92c0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
92d0: 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  YLE.  unsigned l
92e0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
92f0: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
9300: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
9310: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
9320: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9330: 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20    sem_t *pSem;  
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58    /* Named POSIX
9360: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20   semaphore */.  
9370: 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41  char aSemName[MA
9380: 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20  X_PATHNAME+2];  
9390: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20  /* Name of that 
93a0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e  semaphore */.#en
93b0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
93c0: 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69  lists of all uni
93d0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
93e0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ts..*/.static un
93f0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f  ixInodeInfo *ino
9400: 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
9410: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9420: 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72  ion - unixLogErr
9430: 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20  or_x(), is only 
9440: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
9450: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69  the macro.** uni
9460: 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  xLogError()..**.
9470: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
9480: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
9490: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
94a0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72  function and err
94b0: 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73  no has been.** s
94c0: 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  et. It logs a me
94d0: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
94e0: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
94f0: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
9500: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
9510: 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  no and, if possi
9520: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
9530: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
9540: 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72  nt from strerror
9550: 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f  () or.** strerro
9560: 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r_r()..**.** The
9570: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
9580: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
9590: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
95a0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
95b0: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
95c0: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
95d0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
95e0: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
95f0: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
9600: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
9610: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
9620: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
9630: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
9640: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
9650: 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b  ed (e.g. "unlink
9660: 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74  ", "open") and t
9670: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
9680: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a  le-system path,.
9690: 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  ** if any..*/.#d
96a0: 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72  efine unixLogErr
96b0: 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e  or(a,b,c)     un
96c0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
96d0: 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29  (a,b,c,__LINE__)
96e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
96f0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
9700: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
9730: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  r code */.  cons
9740: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
9750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9760: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
9770: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
9780: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9790: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
97a0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
97b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
97c0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
97d0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
97f0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
9800: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
9810: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
9820: 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20  har *zErr;      
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9840: 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  * Message from s
9850: 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75  trerror() or equ
9860: 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ivalent */.  int
9870: 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   iErrno = errno;
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9890: 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72  Saved syscall er
98a0: 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ror number */.. 
98b0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
98c0: 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20  ot a threadsafe 
98d0: 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48  build (SQLITE_TH
98e0: 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68  READSAFE==0), th
98f0: 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  en use.  ** the 
9900: 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74  strerror() funct
9910: 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ion to obtain th
9920: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
9930: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
9940: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
9950: 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69  o errno. Otherwi
9960: 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  se, use strerror
9970: 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20  _r()..  */ .#if 
9980: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
9990: 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56  E && defined(HAV
99a0: 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20  E_STRERROR_R).  
99b0: 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20  char aErr[80];. 
99c0: 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c   memset(aErr, 0,
99d0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a   sizeof(aErr));.
99e0: 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a    zErr = aErr;..
99f0: 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52    /* If STRERROR
9a00: 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62  _R_CHAR_P (set b
9a10: 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70  y autoconf scrip
9a20: 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55  ts) or __USE_GNU
9a30: 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a   is defined,.  *
9a40: 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
9a50: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
9a60: 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  s the GNU versio
9a70: 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28  n of strerror_r(
9a80: 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75  ) that.  ** retu
9a90: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
9aa0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
9ab0: 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  ning the error m
9ac0: 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69  essage. That poi
9ad0: 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70  nter .  ** may p
9ae0: 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20  oint to aErr[], 
9af0: 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20  or it may point 
9b00: 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73  to some static s
9b10: 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65  torage somewhere
9b20: 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
9b30: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
9b40: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
9b50: 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  es the POSIX ver
9b60: 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74  sion of .  ** st
9b70: 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63  rerror_r(), whic
9b80: 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20  h always writes 
9b90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9ba0: 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20   into aErr[]..  
9bb0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63  **.  ** If the c
9bc0: 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  ode incorrectly 
9bd0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
9be0: 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72  is the POSIX ver
9bf0: 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a  sion that is.  *
9c00: 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  * available, the
9c10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9c20: 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20  ill often be an 
9c30: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f  empty string. No
9c40: 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72  t a.  ** huge pr
9c50: 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74  oblem. Incorrect
9c60: 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68  ly concluding th
9c70: 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  at the GNU versi
9c80: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  on is available 
9c90: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64  .  ** could lead
9ca0: 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74   to a segfault t
9cb0: 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20  hough..  */.#if 
9cc0: 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52  defined(STRERROR
9cd0: 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65  _R_CHAR_P) || de
9ce0: 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29  fined(__USE_GNU)
9cf0: 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64  .  zErr = .# end
9d00: 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28  if.  strerror_r(
9d10: 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69  iErrno, aErr, si
9d20: 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a  zeof(aErr)-1);..
9d30: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52  #elif SQLITE_THR
9d40: 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69  EADSAFE.  /* Thi
9d50: 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66  s is a threadsaf
9d60: 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72  e build, but str
9d70: 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74  error_r() is not
9d80: 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20   available. */. 
9d90: 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73   zErr = "";.#els
9da0: 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61  e.  /* Non-threa
9db0: 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65  dsafe build, use
9dc0: 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a   strerror(). */.
9dd0: 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f    zErr = strerro
9de0: 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69  r(iErrno);.#endi
9df0: 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  f..  if( zPath==
9e00: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
9e10: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
9e20: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
9e30: 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29  _unix.c:%d: (%d)
9e40: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
9e50: 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72       iLine, iErr
9e60: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
9e70: 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72  , zErr.  );..  r
9e80: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
9e90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
9ea0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9eb0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
9ec0: 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c   that close() al
9ed0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b  most always work
9ee0: 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f  s, since it is o
9ef0: 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79  nly in a.** very
9f00: 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f   sick applicatio
9f10: 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73  n or on a very s
9f20: 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61  ick platform tha
9f30: 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e  t it might fail.
9f40: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66  .** If it does f
9f50: 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b  ail, simply leak
9f60: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
9f70: 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67  ptor, but do log
9f80: 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a   the.** error..*
9f90: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
9fa0: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
9fb0: 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61   retry close() a
9fc0: 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65  fter EINTR since
9fd0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
9fe0: 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61  criptor might ha
9ff0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
a000: 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65  reused by anothe
a010: 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20  r thread..** So 
a020: 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72  we don't even tr
a030: 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  y to recover fro
a040: 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73  m an EINTR.  Jus
a050: 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a  t log the error.
a060: 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a  ** and move on..
a070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a080: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78  obust_close(unix
a090: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  File *pFile, int
a0a0: 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b   h, int lineno){
a0b0: 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68  .  if( osClose(h
a0c0: 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  ) ){.    unixLog
a0d0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49  ErrorAtLine(SQLI
a0e0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
a0f0: 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20  "close",.       
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a  pFile ? pFile->z
a120: 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f  Path : 0, lineno
a130: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a140: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
a150: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
a160: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
a170: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
a180: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
a190: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
a1a0: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
a1b0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a1c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a1d0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a1e0: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
a1f0: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
a200: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
a210: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
a220: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
a230: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
a240: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72   p->pNext;.    r
a250: 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
a260: 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45  e, p->fd, __LINE
a270: 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  __);.    sqlite3
a280: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
a290: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
a2a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
a2b0: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
a2c0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
a2d0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
a2e0: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
a2f0: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
a300: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
a310: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
a320: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
a330: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
a340: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
a350: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a360: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a370: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
a380: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
a390: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
a3a0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a3b0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a3c0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
a3d0: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
a3e0: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
a3f0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
a400: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
a410: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
a420: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a430: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
a440: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
a450: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
a460: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
a470: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
a480: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a490: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
a4a0: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
a4b0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
a4c0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
a4d0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
a4e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a4f0: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
a500: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
a510: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
a520: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a530: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a540: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
a550: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
a560: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
a570: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
a580: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
a590: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
a5a0: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
a5b0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
a5c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a5d0: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
a5e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
a5f0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
a600: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
a610: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
a620: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
a630: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
a640: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
a650: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
a660: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
a670: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
a680: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
a690: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
a6a0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
a6b0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
a6c0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
a6d0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
a6e0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
a6f0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
a700: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a710: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
a720: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
a730: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
a740: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
a750: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
a760: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
a780: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
a790: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
a7a0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
a7b0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
a7c0: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
a7d0: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
a7e0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
a7f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
a800: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
a820: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
a830: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
a840: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a860: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a870: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
a880: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
a890: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
a8a0: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
a8b0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
a8c0: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
a8d0: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
a8e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
a8f0: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
a900: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
a910: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a920: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
a930: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
a940: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
a950: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
a960: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
a970: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
a980: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
a990: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
a9a0: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
a9b0: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
a9c0: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
a9d0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
a9e0: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
a9f0: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
aa00: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
aa10: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46   rc!=0 ){.    pF
aa20: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
aa30: 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45   errno;.#ifdef E
aa40: 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28  OVERFLOW.    if(
aa50: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
aa60: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
aa70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
aa80: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
aa90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
aaa0: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
aab0: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
aac0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
aad0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
aae0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
aaf0: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
ab00: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
ab10: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
ab20: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
ab30: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
ab40: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
ab50: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
ab60: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
ab70: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
ab80: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
ab90: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
aba0: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
abb0: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
abc0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
abd0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
abe0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
abf0: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
ac00: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
ac10: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
ac20: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
ac30: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
ac40: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
ac50: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
ac60: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
ac70: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
ac80: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
ac90: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
aca0: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
acb0: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
acc0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
acd0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
ace0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
acf0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
ad00: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
ad10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
ad20: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
ad30: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
ad40: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
ad50: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
ad60: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
ad70: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
ad80: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
ad90: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
ada0: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
adb0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =1 ){.      pFil
adc0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  e->lastErrno = e
add0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
ade0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
adf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ae00: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
ae10: 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
ae20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  c!=0 ){.      pF
ae30: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
ae40: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65   errno;.      re
ae50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ae60: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
ae70: 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  dif..  memset(&f
ae80: 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ileId, 0, sizeof
ae90: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c  (fileId));.  fil
aea0: 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75  eId.dev = statbu
aeb0: 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53  f.st_dev;.#if OS
aec0: 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49  _VXWORKS.  fileI
aed0: 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70  d.pId = pFile->p
aee0: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65  Id;.#else.  file
aef0: 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  Id.ino = statbuf
af00: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
af10: 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
af20: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
af30: 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28  Inode && memcmp(
af40: 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65  &fileId, &pInode
af50: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
af60: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
af70: 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
af80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
af90: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
afa0: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c      pInode = sql
afb0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
afc0: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a  eof(*pInode) );.
afd0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d      if( pInode==
afe0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
aff0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b000: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
b010: 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  (pInode, 0, size
b020: 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20  of(*pInode));.  
b030: 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65    memcpy(&pInode
b040: 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49  ->fileId, &fileI
b050: 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64  d, sizeof(fileId
b060: 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ));.    pInode->
b070: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  nRef = 1;.    pI
b080: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e  node->pNext = in
b090: 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e  odeList;.    pIn
b0a0: 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ode->pPrev = 0;.
b0b0: 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73      if( inodeLis
b0c0: 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70  t ) inodeList->p
b0d0: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  Prev = pInode;. 
b0e0: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
b0f0: 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Inode;.  }else{.
b100: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66      pInode->nRef
b110: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f  ++;.  }.  *ppIno
b120: 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72  de = pInode;.  r
b130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b140: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
b150: 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74   a unixFile that
b160: 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20   is a database. 
b170: 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c   Verify the foll
b180: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  owing:.**.** (1)
b190: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
b1a0: 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20  y one hard link 
b1b0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28  on the file.** (
b1c0: 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  2) The file is n
b1d0: 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
b1e0: 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69  nk.** (3) The fi
b1f0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
b200: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b210: 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20  ked.**.** Issue 
b220: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b230: 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20  TE_WARNING,...) 
b240: 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74  messages if anyt
b250: 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68  hing is not righ
b260: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b270: 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75  d verifyDbFile(u
b280: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b290: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b2a0: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  uf;.  int rc;.  
b2b0: 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
b2c0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b2d0: 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f 2a  WARNED ){.    /*
b2e0: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
b2f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  the following wa
b300: 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72 65  rnings have alre
b310: 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64 2e  ady been issued.
b320: 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20    Do not.    ** 
b330: 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20 61  repeat them so a
b340: 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65 72  s not to clutter
b350: 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20 2a   the error log *
b360: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
b370: 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  }.  rc = osFstat
b380: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
b390: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
b3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b3b0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
b3c0: 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64   "cannot fstat d
b3d0: 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c  b file %s", pFil
b3e0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b3f0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b400: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
b410: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
b420: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b430: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b440: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b450: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b460: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b470: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b480: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b490: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b4a0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b4b0: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
b4c0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
b4d0: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
b4e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b4f0: 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69    if( buf.st_nli
b500: 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nk>1 ){.    sqli
b510: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b520: 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c  ARNING, "multipl
b530: 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a  e links to file:
b540: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b550: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b560: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b570: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b580: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b590: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
b5a0: 65 21 3d 30 0a 20 20 20 26 26 20 28 28 72 63 20  e!=0.   && ((rc 
b5b0: 3d 20 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e  = osStat(pFile->
b5c0: 7a 50 61 74 68 2c 20 26 62 75 66 29 29 21 3d 30  zPath, &buf))!=0
b5d0: 0a 20 20 20 20 20 20 20 7c 7c 20 62 75 66 2e 73  .       || buf.s
b5e0: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
b5f0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
b600: 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
b610: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b620: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
b630: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
b640: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
b650: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
b660: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
b670: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
b680: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
b690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b6a0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
b6b0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
b6c0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
b6d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
b6e0: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
b6f0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
b700: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
b710: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
b720: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
b730: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
b740: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
b750: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
b760: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
b770: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
b780: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
b790: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
b7a0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
b7b0: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
b7c0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
b7d0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
b7e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
b7f0: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
b800: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b810: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
b820: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
b830: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
b840: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
b850: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b860: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
b870: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b880: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
b890: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
b8a0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
b8b0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
b8c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
b8d0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
b8e0: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
b8f0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
b900: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
b910: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
b920: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
b930: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
b940: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
b950: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
b960: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
b970: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
b980: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
b990: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
b9a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
b9b0: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
b9c0: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
b9d0: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
b9e0: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
b9f0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
ba00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
ba10: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
ba20: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ba30: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
ba40: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ba50: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
ba60: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
ba70: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
ba80: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
ba90: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
baa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bab0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
bac0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69  DLOCK;.      pFi
bad0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
bae0: 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  errno;.    } els
baf0: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
bb00: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
bb10: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
bb20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
bb30: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
bb40: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
bb50: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
bb60: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
bb70: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
bb80: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
bb90: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
bba0: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
bbb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
bbc0: 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20  ttempt to set a 
bbd0: 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74  system-lock on t
bbe0: 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20  he file pFile.  
bbf0: 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  The lock is .** 
bc00: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f  described by pLo
bc10: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
bc20: 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65   pFile was opene
bc30: 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f  d read/write fro
bc40: 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65  m unix-excl, the
bc50: 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a  n the only lock.
bc60: 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64  ** ever obtained
bc70: 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65   is an exclusive
bc80: 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73   lock, and it is
bc90: 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c   obtained exactl
bca0: 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69  y once.** the fi
bcb0: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
bcc0: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
bcd0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
bce0: 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a  system locking.*
bcf0: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63  * operations bec
bd00: 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63  ome no-ops.  Loc
bd10: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  king operations 
bd20: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74  still happen int
bd30: 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f  ernally,.** in o
bd40: 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61  rder to coordina
bd50: 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65  te access betwee
bd60: 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  n separate datab
bd70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
bd80: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70  ** within this p
bd90: 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20  rocess, but all 
bda0: 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c  of that is handl
bdb0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
bdc0: 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e   the.** operatin
bdd0: 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  g system does no
bde0: 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a  t participate..*
bdf0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
be00: 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72  on is a pass-thr
be10: 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f  ough to fcntl(F_
be20: 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20  SETLK) if pFile 
be30: 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20  is using.** any 
be40: 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22  VFS other than "
be50: 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66  unix-excl" or if
be60: 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64   pFile is opened
be70: 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a   on "unix-excl".
be80: 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
be90: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  nly..**.** Zero 
bea0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
beb0: 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65  he call complete
bec0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
bed0: 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a  or -1 if a call.
bee0: 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61  ** to fcntl() fa
bef0: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
bf00: 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20  e, errno is set 
bf10: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62  appropriately (b
bf20: 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73  y fcntl())..*/.s
bf30: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
bf40: 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  leLock(unixFile 
bf50: 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66  *pFile, struct f
bf60: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
bf70: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e  int rc;.  unixIn
bf80: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
bf90: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
bfa0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
bfb0: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
bfc0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
bfd0: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69  0 );.  if( ((pFi
bfe0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
bff0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d  UNIXFILE_EXCL)!=
c000: 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72  0 || pInode->bPr
c010: 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26  ocessLock).   &&
c020: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
c030: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
c040: 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a  DONLY)==0).  ){.
c050: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
c060: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
c070: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
c080: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
c090: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
c0a0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ->nLock==0 );.  
c0b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c0c0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c0d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c0e0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
c0f0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
c100: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
c110: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
c120: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
c130: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
c140: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c150: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
c160: 20 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74    if( rc<0 ) ret
c170: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49  urn rc;.      pI
c180: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
c190: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ck = 1;.      pI
c1a0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
c1b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c1c0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rc = 0;.    }.  
c1d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
c1e0: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
c1f0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b  , F_SETLK, pLock
c200: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c210: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
c220: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
c230: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
c240: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
c250: 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
c260: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
c270: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
c280: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
c290: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
c2a0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
c2b0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
c2c0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
c2d0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
c2e0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
c2f0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
c300: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
c310: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
c320: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
c330: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
c340: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
c350: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
c360: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
c370: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
c380: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
c390: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
c3a0: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
c3b0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
c3c0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
c3d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
c3e0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
c3f0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
c400: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
c410: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
c420: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
c430: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
c440: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
c450: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
c460: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
c470: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
c480: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
c490: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
c4a0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
c4b0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
c4c0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
c4d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c4e0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
c4f0: 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
c500: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
c510: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
c520: 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
c530: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
c540: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73  c int unixLock(s
c550: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
c560: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
c570: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
c580: 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68  ing describes th
c590: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c5a0: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
c5b0: 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c  locks and.  ** l
c5c0: 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ock transitions 
c5d0: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
c5e0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73  POSIX advisory s
c5f0: 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73  hared and exclus
c600: 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72  ive.  ** lock pr
c610: 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64  imitives (called
c620: 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20   read-locks and 
c630: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f  write-locks belo
c640: 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a  w, to avoid.  **
c650: 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20   confusion with 
c660: 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65  SQLite lock name
c670: 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68  s). The algorith
c680: 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74  ms are complicat
c690: 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79  ed.  ** slightly
c6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
c6b0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
c6c0: 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20  windows systems 
c6d0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20  simultaneously. 
c6e0: 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68   ** accessing th
c6f0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
c700: 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68  file, in case th
c710: 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75 69  at is ever requi
c720: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  red..  **.  ** S
c730: 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69  ymbols defined i
c740: 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79  n os.h indentify
c750: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c760: 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65 73  te' and the 'res
c770: 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27  erved.  ** byte'
c780: 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79  , each single by
c790: 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77  tes at well know
c7a0: 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74  n offsets, and t
c7b0: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
c7c0: 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72    ** range', a r
c7d0: 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74 65  ange of 510 byte
c7e0: 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77  s at a well know
c7f0: 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20  n offset..  **. 
c800: 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20   ** To obtain a 
c810: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72  SHARED lock, a r
c820: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ead-lock is obta
c830: 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e  ined on the 'pen
c840: 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e  ding.  ** byte'.
c850: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63    If this is suc
c860: 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f  cessful, a rando
c870: 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20  m byte from the 
c880: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
c890: 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61 64  * range' is read
c8a0: 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  -locked and the 
c8b0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
c8c0: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
c8d0: 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  sed..  **.  ** A
c8e0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
c8f0: 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  y obtain a RESER
c900: 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  VED lock after i
c910: 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6c  t has a SHARED l
c920: 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45  ock..  ** A RESE
c930: 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70  RVED lock is imp
c940: 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62  lemented by grab
c950: 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  bing a write-loc
c960: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72  k on the.  ** 'r
c970: 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a  eserved byte'. .
c980: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
c990: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
c9a0: 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ain a PENDING lo
c9b0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
c9c0: 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20  obtained a.  ** 
c9d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50  SHARED lock. A P
c9e0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69  ENDING lock is i
c9f0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62  mplemented by ob
ca00: 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d  taining a write-
ca10: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
ca20: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e   'pending byte'.
ca30: 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
ca40: 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44  at no new SHARED
ca50: 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20   locks can be.  
ca60: 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74  ** obtained, but
ca70: 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45 44   existing SHARED
ca80: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77   locks are allow
ca90: 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41  ed to persist. A
caa0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f   process.  ** do
cab0: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f  es not have to o
cac0: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
cad0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79   lock on the way
cae0: 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   to a PENDING lo
caf0: 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72  ck..  ** This pr
cb00: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 62  operty is used b
cb10: 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20  y the algorithm 
cb20: 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  for rolling back
cb30: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
cb40: 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61    ** after a cra
cb50: 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  sh..  **.  ** An
cb60: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
cb70: 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72 20   obtained after 
cb80: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
cb90: 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20  s held, is.  ** 
cba0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
cbb0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
cbc0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74  -lock on the ent
cbd0: 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74 65  ire 'shared byte
cbe0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69  .  ** range'. Si
cbf0: 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f  nce all other lo
cc00: 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72 65  cks require a re
cc10: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f  ad-lock on one o
cc20: 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a  f the bytes.  **
cc30: 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e   within this ran
cc40: 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  ge, this ensures
cc50: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c   that no other l
cc60: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
cc70: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cc80: 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  se. .  **.  ** T
cc90: 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67  he reason a sing
cca0: 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62  le byte cannot b
ccb0: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
ccc0: 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  f the 'shared by
ccd0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
cce0: 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73  s that some vers
ccf0: 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20  ions of windows 
cd00: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72  do not support r
cd10: 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20  ead-locks. By.  
cd20: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e  ** locking a ran
cd30: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20  dom byte from a 
cd40: 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e  range, concurren
cd50: 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d  t SHARED locks m
cd60: 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76  ay exist.  ** ev
cd70: 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e  en if the lockin
cd80: 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65 64  g primitive used
cd90: 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72 69   is always a wri
cda0: 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  te-lock..  */.  
cdb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cdc0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
cdd0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
cde0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
cdf0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
ce00: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ce10: 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e  ock;.  int tErrn
ce20: 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
ce30: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
ce40: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
ce50: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
ce60: 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
ce70: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
ce80: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
ce90: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69  eFileLock), azFi
cea0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46  leLock(pFile->eF
ceb0: 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  ileLock),.      
cec0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
ced0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
cee0: 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  ock), pFile->pIn
cef0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67  ode->nShared , g
cf00: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a  etpid()));..  /*
cf10: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cf20: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
cf30: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
cf40: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
cf50: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
cf60: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cf70: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
cf80: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cf90: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cfa0: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cfb0: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cfc0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cfd0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cfe0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cff0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
d000: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
d010: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
d020: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
d030: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
d040: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
d050: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
d060: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
d070: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d080: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
d090: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
d0a0: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
d0b0: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
d0c0: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
d0d0: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
d0e0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
d0f0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
d100: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
d110: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
d120: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
d130: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
d140: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
d150: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
d160: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
d170: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
d180: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
d190: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
d1a0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d1b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d1c0: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
d1d0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d1e0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
d1f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
d200: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d210: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d220: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
d230: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d240: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d250: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d260: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d270: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d280: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d290: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d2a0: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d2b0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d2c0: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d2d0: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d2e0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d2f0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d300: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d310: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d320: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d330: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d340: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d350: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d360: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d370: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d380: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d390: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d3a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d3b0: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d3c0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d3d0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d3e0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d3f0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d400: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d410: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d420: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d430: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d440: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d450: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d460: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d470: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d480: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d490: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d4a0: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d4b0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d4c0: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d4d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d4e0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d4f0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d500: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d510: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d520: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d530: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d540: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d550: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d560: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d570: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d580: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d590: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d5a0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d5b0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d5c0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d5d0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d5e0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d5f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d600: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d610: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d620: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d630: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d640: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d650: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d660: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d670: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d680: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d690: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d6a0: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d6b0: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d6c0: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d6d0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d6e0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d6f0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d700: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d710: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d720: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d730: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d740: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d750: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d760: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d770: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d780: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d790: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d7a0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d7b0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d7c0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d7d0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d7e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d7f0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
d800: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d810: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d820: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d830: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d840: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d850: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d860: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d870: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d880: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d890: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d8a0: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d8b0: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d8c0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d8d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d8e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d8f0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d910: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d920: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d930: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d940: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d950: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d960: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d970: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d980: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d990: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d9a0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d9b0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d9c0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d9d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d9e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d9f0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
da00: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
da10: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
da20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
da30: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
da40: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
da50: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
da60: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
da70: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
da80: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
da90: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
daa0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
dab0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
dac0: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
dad0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
dae0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
daf0: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
db00: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
db10: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
db20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
db30: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
db40: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
db50: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
db60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
db70: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
db80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
db90: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
dba0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
dbb0: 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ock;.    }else{.
dbc0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
dbd0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
dbe0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
dbf0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
dc00: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
dc10: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
dc20: 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
dc30: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
dc40: 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
dc50: 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
dc60: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
dc70: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
dc80: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
dc90: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
dca0: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
dcb0: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
dcc0: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
dcd0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
dce0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
dcf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
dd00: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
dd10: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
dd20: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
dd30: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
dd40: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
dd50: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
dd60: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
dd70: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
dd80: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
dd90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
dda0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ddb0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
ddc0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a  ype = F_WRLCK;..
ddd0: 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c      assert( eFil
dde0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ddf0: 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
de00: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
de10: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69  K );.    if( eFi
de20: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
de30: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
de40: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
de50: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
de60: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
de70: 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1L;.    }else{. 
de80: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
de90: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
dea0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
deb0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
dec0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
ded0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
dee0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
def0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
df00: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
df10: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
df20: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
df30: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
df40: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
df50: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
df60: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
df70: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
df80: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rrno;.      }.  
df90: 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64    }.  }.  ..#ifd
dfa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
dfb0: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
dfc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e  transaction-coun
dfd0: 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b  ter change check
dfe0: 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20  ing flags when. 
dff0: 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e   ** transitionin
e000: 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20  g from a SHARED 
e010: 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  to a RESERVED lo
e020: 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a  ck.  The change.
e030: 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44    ** from SHARED
e040: 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72   to RESERVED mar
e050: 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ks the beginning
e060: 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a   of a normal.  *
e070: 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  * write operatio
e080: 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75  n (not a hot jou
e090: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
e0a0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
e0b0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70  QLITE_OK.   && p
e0c0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
e0d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
e0e0: 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  && eFileLock==RE
e0f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b  SERVED_LOCK.  ){
e100: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e  .    pFile->tran
e110: 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20  sCntrChng = 0;. 
e120: 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
e130: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  te = 0;.    pFil
e140: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
e150: 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
e160: 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
e170: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
e180: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e190: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
e1a0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e1b0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
e1c0: 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
e1d0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e1e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
e1f0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
e200: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
e210: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e220: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
e230: 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b  K;.  }..end_lock
e240: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
e250: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
e260: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
e270: 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %s (unix)\n", pF
e280: 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
e290: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
e2a0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
e2b0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
e2c0: 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
e2d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e2e0: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
e2f0: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
e300: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
e310: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
e320: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
e330: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
e340: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
e350: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
e360: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
e370: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
e380: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
e390: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20  UnixUnusedFd *p 
e3a0: 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  = pFile->pUnused
e3b0: 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
e3c0: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  Inode->pUnused;.
e3d0: 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65    pInode->pUnuse
e3e0: 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e  d = p;.  pFile->
e3f0: 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d  h = -1;.  pFile-
e400: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
e410: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
e420: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
e430: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
e440: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
e450: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
e460: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
e470: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e480: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
e490: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
e4a0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
e4b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
e4c0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
e4d0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
e4e0: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
e4f0: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
e500: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
e510: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
e520: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
e530: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
e540: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
e550: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
e560: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
e570: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
e580: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
e590: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
e5a0: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
e5b0: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
e5c0: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
e5d0: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
e5e0: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
e5f0: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
e600: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
e610: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
e620: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
e630: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
e640: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
e650: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
e660: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
e670: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
e680: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
e690: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
e6a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
e6b0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
e6c0: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
e6d0: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
e6e0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e6f0: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
e700: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
e710: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
e720: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
e730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
e740: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
e750: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
e760: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
e770: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
e780: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e790: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
e7a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
e7b0: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e7c0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
e7d0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
e7e0: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67  nShared,.      g
e7f0: 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73  etpid()));..  as
e800: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
e810: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e820: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
e830: 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63  leLock<=eFileLoc
e840: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
e850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e860: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
e870: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
e880: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
e890: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
e8a0: 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69  Shared!=0 );.  i
e8b0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
e8c0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
e8d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e8e0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e8f0: 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ==pFile->eFileLo
e900: 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ck );..#ifdef SQ
e910: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
e920: 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
e930: 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
e940: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
e950: 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
e960: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
e970: 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
e980: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
e990: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
e9a0: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
e9b0: 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
e9c0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
e9d0: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
e9e0: 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
e9f0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ea00: 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
ea10: 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
ea20: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
ea30: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
ea40: 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
ea50: 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
ea60: 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
ea70: 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
ea80: 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
ea90: 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
eaa0: 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
eab0: 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
eac0: 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
ead0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
eae0: 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
eaf0: 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
eb00: 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
eb10: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e  dif..    /* down
eb20: 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61  grading to a sha
eb30: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20  red lock on NFS 
eb40: 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e  involves clearin
eb50: 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  g the write lock
eb60: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65  .    ** before e
eb70: 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20  stablishing the 
eb80: 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76  readlock - to av
eb90: 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69  oid a race condi
eba0: 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64  tion we downgrad
ebb0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  e.    ** the loc
ebc0: 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73  k in 2 blocks, s
ebd0: 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74  o that part of t
ebe0: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65  he range will be
ebf0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20   covered by a . 
ec00: 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b     ** write lock
ec10: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20   until the rest 
ec20: 69 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  is covered by a 
ec30: 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a  read lock:.    *
ec40: 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a  *  1:   [WWWWW].
ec50: 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e      **  2:   [..
ec60: 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20  ..W].    **  3: 
ec70: 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a    [RRRRW].    **
ec80: 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20    4:   [RRRR.]. 
ec90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46     */.    if( eF
eca0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ecb0: 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21 64 65  LOCK ){..#if !de
ecc0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
ecd0: 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42   || !SQLITE_ENAB
ece0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
ecf0: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e  .      (void)han
ed00: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20  dleNFSUnlock;.  
ed10: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e 64      assert( hand
ed20: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29  leNFSUnlock==0 )
ed30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
ed40: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
ed50: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
ed60: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
ed70: 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e       if( handleN
ed80: 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  FSUnlock ){.    
ed90: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20      int tErrno; 
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
edb0: 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
edc0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72   system call err
edd0: 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ors */.        o
ede0: 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53  ff_t divSize = S
edf0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a  HARED_SIZE - 1;.
ee00: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
ee10: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ee20: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20  _UNLCK;.        
ee30: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ee40: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ee50: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ee60: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ee70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
ee80: 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20  n = divSize;.   
ee90: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
eea0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
eeb0: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
eec0: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
eed0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
eee0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
eef0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
ef00: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
ef10: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
ef20: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ef30: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
ef40: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
ef50: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ef60: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
ef70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
ef80: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
ef90: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
efa0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
efb0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
efc0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
efd0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
efe0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
eff0: 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
f000: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f010: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f020: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f030: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f040: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f050: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
f060: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
f070: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
f080: 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_RDLOCK);.     
f090: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
f0a0: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
f0b0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
f0c0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
f0d0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rno;.          }
f0e0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f0f0: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
f110: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f120: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
f130: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
f140: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
f150: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
f160: 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69  ARED_FIRST+divSi
f170: 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ze;.        lock
f180: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f190: 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20  SIZE-divSize;.  
f1a0: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
f1b0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f1c0: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
f1d0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
f1e0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f1f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f200: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
f210: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f220: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
f230: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
f240: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
f250: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
f260: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
f270: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f280: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f290: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
f2a0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f2b0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f2c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
f2d0: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
f2e0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f2f0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f300: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f310: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f320: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f330: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f340: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f350: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f370: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f380: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
f390: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
f3a0: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
f3b0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
f3c0: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
f3d0: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
f3e0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
f3f0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
f400: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
f410: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
f420: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f430: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
f440: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
f450: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
f460: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
f470: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
f480: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
f490: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
f4a0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f4b0: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
f4c0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f4d0: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
f4e0: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
f4f0: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
f500: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
f510: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
f520: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
f530: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f540: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f550: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46  CK;.          pF
f560: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f570: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
f580: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
f590: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f5a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
f5b0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f5c0: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
f5d0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
f5e0: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
f5f0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
f600: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
f610: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
f620: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
f630: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
f640: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
f650: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
f660: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
f670: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
f680: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
f690: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
f6a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f6b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f6c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
f6d0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
f6e0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f6f0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f700: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f710: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f720: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f730: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f740: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f750: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f760: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f770: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f780: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f790: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f7a0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f7b0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f7c0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f7d0: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f7e0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f7f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f800: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f810: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f820: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f830: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f840: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f850: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f860: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f870: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f880: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f890: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f8a0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f8b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f8c0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f8d0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f8e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f8f0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
f900: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f910: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f920: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f930: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f940: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f950: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f960: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f970: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f980: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f990: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f9a0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f9b0: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f9c0: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f9d0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
f9e0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
f9f0: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
fa00: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
fa10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
fa20: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
fa30: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
fa40: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
fa50: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
fa60: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
fa70: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
fa80: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
fa90: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
faa0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
fab0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fac0: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
fad0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
fae0: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
faf0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
fb00: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
fb10: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
fb20: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
fb30: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
fb40: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
fb50: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
fb60: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
fb70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
fb80: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
fb90: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fba0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
fbb0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
fbc0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
fbd0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
fbe0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
fbf0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
fc00: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
fc10: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
fc20: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
fc30: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
fc40: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
fc50: 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
fc60: 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
fc70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73   );.  return pos
fc80: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
fc90: 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 73  leLock, 0);.}..s
fca0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
fcb0: 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
fcc0: 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFd, i64 nByte);
fcd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
fce0: 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46  xUnmapfile(unixF
fcf0: 69 6c 65 20 2a 70 46 64 29 3b 0a 0a 2f 2a 0a 2a  ile *pFd);../*.*
fd00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
fd10: 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
fd20: 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
fd30: 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
fd40: 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
fd50: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
fd60: 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
fd70: 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
fd80: 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
fd90: 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
fda0: 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
fdb0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
fdc0: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
fdd0: 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
fde0: 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
fdf0: 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
fe00: 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
fe10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
fe20: 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
fe30: 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
fe40: 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
fe50: 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
fe60: 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
fe70: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
fe80: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
fe90: 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
fea0: 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
feb0: 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
fec0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fed0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
fee0: 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
fef0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ff00: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
ff10: 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
ff20: 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
ff30: 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
ff40: 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
ff50: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
ff60: 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
ff70: 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74     if( pFile->ct
ff80: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
ff90: 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
ffa0: 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
ffb0: 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
ffc0: 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
ffd0: 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
ffe0: 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
fff0: 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
10000 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
10010 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
10020 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
10030 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
10040 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
10050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10060 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
10070 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
10080 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
10090 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
100a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
100b0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
100c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
100d0 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
100e0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
100f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10100 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
10110 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
10120 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
10130 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
10140 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
10150 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
10160 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
10170 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
10180 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
10190 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
101a0 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
101b0 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
101c0 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
101d0 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
101e0 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
101f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10200 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
10210 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
10220 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
10230 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
10240 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
10250 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
10260 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
10270 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10280 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10290 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
102a0 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
102b0 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
102c0 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
102d0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
102e0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
102f0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
10300 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
10310 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
10320 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
10330 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
10340 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
10350 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
10360 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
10370 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
10380 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
10390 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
103a0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
103b0 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
103c0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
103d0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
103e0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
103f0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
10400 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
10410 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
10420 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
10430 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
10440 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
10510 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10530 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
10540 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10550 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10560 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10570 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
10580 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
10590 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
105a0 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
105b0 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
105c0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
105d0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
105e0 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
105f0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
10600 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
10610 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
10620 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
10630 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
10640 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10650 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10660 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10670 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
10680 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
10690 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
106a0 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
106b0 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
106c0 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
106d0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
106e0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
106f0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
10700 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10710 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
10720 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
10730 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
10740 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10750 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10760 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10770 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
10780 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
10790 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
107a0 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
107b0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
107c0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
107d0 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
107e0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
107f0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
10800 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
10810 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10820 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
10830 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10840 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10850 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10860 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10870 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
10880 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
10890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
108a0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
108b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
108c0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
108d0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
108e0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
108f0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
10900 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10910 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
10920 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
10930 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10940 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10950 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10960 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10970 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
109a0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
109b0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
109c0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
109d0 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
109e0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
109f0 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
10a10 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
10a20 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10a30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10a40 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a60 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
10b10 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b30 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
10b40 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10b50 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10b60 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
10b70 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
10b80 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
10b90 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
10ba0 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
10bb0 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
10bc0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10bd0 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10be0 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10bf0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
10c00 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
10c10 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
10c20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
10c30 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
10c40 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
10c50 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
10c60 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
10c70 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
10c80 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
10c90 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
10ca0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
10cb0 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
10cc0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
10cd0 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
10ce0 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
10cf0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
10d00 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
10d10 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
10d20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
10d30 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
10d40 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
10d50 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
10d60 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
10d70 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
10d80 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
10d90 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
10da0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
10db0 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
10dc0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
10dd0 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
10de0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
10df0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
10e00 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
10e10 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
10e20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
10e30 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
10e40 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
10e50 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
10e60 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
10e70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
10e80 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
10e90 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
10ea0 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
10eb0 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
10ec0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
10ed0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
10ee0 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
10ef0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
10f00 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
10f10 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
10f20 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
10f30 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
10f40 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
10f50 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
10f60 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10f70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
10f80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
10f90 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
10fa0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
10fb0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
10fc0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
10fd0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
10fe0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
10ff0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11000 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
11010 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
11020 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
11030 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
11040 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
11050 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
11060 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
11070 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
11080 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
11090 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
110a0 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
110b0 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
110c0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
110d0 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
110e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
110f0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
11100 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
11110 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
11120 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
11130 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
11140 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11160 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11170 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11180 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11190 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
111a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
111b0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
111c0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
111d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
111e0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
111f0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
11200 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
11210 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
11220 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
11230 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
11240 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11250 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11260 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11270 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
11280 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11290 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
112a0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
112b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
112c0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
112d0 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
112e0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
112f0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
11300 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
11310 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
11320 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
11330 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
11340 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11350 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11360 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11370 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
11380 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11390 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
113a0 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
113b0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
113c0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
113d0 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
113e0 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
113f0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
11400 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
11410 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
11420 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
11430 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
11440 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11460 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11470 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11480 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11490 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
114a0 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
114b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
114c0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
114d0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
114e0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
114f0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
11500 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
11510 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
11520 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
11530 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
11540 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11550 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11560 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11570 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11580 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11590 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
115a0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
115b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
115c0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
115d0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
115e0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
115f0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
11600 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
11610 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
11620 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
11630 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
11640 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11650 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11660 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11670 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11680 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11690 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
116a0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
116b0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
116c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
116d0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
116e0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
116f0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
11700 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
11710 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
11720 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
11730 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
11740 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11750 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11760 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11770 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11780 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
11790 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
117a0 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
117b0 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
117c0 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
117d0 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
117e0 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
117f0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
11800 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11810 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11820 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11830 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
11840 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11850 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11860 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11870 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11880 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11890 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
118a0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
118b0 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
118c0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
118d0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
118e0 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
118f0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
11900 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
11910 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
11920 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
11930 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11940 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11950 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11970 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
11980 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
11990 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
119a0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
119b0 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
119c0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
119d0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
119e0 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
119f0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
11a00 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
11a10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11a20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
11a30 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11a40 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11a50 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11a60 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11a70 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11a80 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11a90 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11aa0 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11ab0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11ac0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11ad0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
11af0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
11b00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11b10 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
11b20 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
11b30 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
11b40 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11b50 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11b60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
11b70 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
11b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11ba0 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20   } .  .  /* got 
11bb0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
11bc0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
11bd0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
11be0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
11bf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11c00 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
11c10 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11c20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11c30 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
11c40 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11c50 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11c60 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11c70 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11c80 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11c90 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11ca0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
11cb0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
11cc0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
11cd0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
11ce0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
11cf0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
11d00 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63  .** When the loc
11d10 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68  king level reach
11d20 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65  es NO_LOCK, dele
11d30 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
11d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d50 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  dotlockUnlock(sq
11d60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11d70 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
11d80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11d90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11da0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
11db0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
11dc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11dd0 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ntext;.  int rc;
11de0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11df0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
11e00 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
11e10 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f  as %d pid=%d (do
11e20 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  tlock)\n", pFile
11e30 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
11e40 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
11e50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74  ->eFileLock, get
11e60 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72  pid()));.  asser
11e70 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
11e80 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
11e90 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
11ea0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
11eb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11ec0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
11ed0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11ee0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
11ef0 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
11f00 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
11f10 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11f20 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
11f30 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
11f40 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
11f50 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
11f60 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
11f70 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
11f80 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
11f90 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11fa0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
11fb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11fc0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11fd0 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
11fe0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
11ff0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12000 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
12010 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
12020 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
12030 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
12040 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
12050 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49  && errno==ENOTDI
12060 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e  R ) rc = osUnlin
12070 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  k(zLockFile);.  
12080 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
12090 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
120a0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  no;.    rc = 0;.
120b0 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
120c0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
120d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
120e0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
120f0 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
12100 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12110 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
12120 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
12130 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
12140 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
12150 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12160 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
12170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12180 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
12190 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  e.  Make sure th
121a0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
121b0 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20  released before 
121c0 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  closing..*/.stat
121d0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c  ic int dotlockCl
121e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
121f0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
12200 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12210 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
12220 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
12230 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
12240 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
12250 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
12260 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12270 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
12280 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d  ntext);.    rc =
12290 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
122a0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
122b0 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   rc;.}./********
122c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
122d0 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c  f the dot-file l
122e0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
122f0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
12300 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c  ** Begin flock L
123d0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
123e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73  *******.**.** Us
12400 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79  e the flock() sy
12410 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20  stem call to do 
12420 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  file locking..**
12430 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  .** flock() lock
12440 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
12450 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20  file locking in 
12460 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73  that the various
12470 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c  .** fine-grain l
12480 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75  ocking levels su
12490 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74  pported by SQLit
124a0 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20  e are collapsed 
124b0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
124c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
124d0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
124e0 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
124f0 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49  ED, and.** PENDI
12500 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65  NG locks are the
12510 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61   same thing as a
12520 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
12530 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69  .  SQLite.** sti
12540 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f  ll works when yo
12550 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63  u do this, but c
12560 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65  oncurrency is re
12570 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f  duced since.** o
12580 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
12590 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64  cess can be read
125a0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
125b0 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   at a time..**.*
125c0 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74  * Omit this sect
125d0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ion if SQLITE_EN
125e0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
125f0 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66  LE is turned off
12600 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c   or if.** compil
12610 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e  ing for VXWORKS.
12620 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
12630 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12640 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
12650 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  KS../*.** Retry 
12660 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
12670 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
12680 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
12690 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
126a0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
126b0 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
126c0 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
126d0 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
126e0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
126f0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
12700 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
12720 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
12730 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
12740 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
12750 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12760 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
12770 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
12780 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
12790 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
127a0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
127b0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
127c0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
127d0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
127e0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
127f0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12800 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12810 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12820 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12830 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12840 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
12850 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12860 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
12870 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
12880 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
12890 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
128a0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
128b0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
128c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
128d0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
128e0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
128f0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12900 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12910 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12920 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12930 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12940 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12950 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
12960 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
12970 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
12980 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
12990 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
129a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
129b0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
129c0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
129d0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
129e0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
129f0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12a00 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12a10 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12a20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
12a30 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
12a40 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
12a50 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
12a60 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
12a70 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
12a80 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
12a90 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
12aa0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
12ab0 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
12ac0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12ad0 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
12ae0 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
12af0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
12b00 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12b10 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
12b20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
12b30 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
12b40 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
12b50 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
12b60 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12b70 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
12b80 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
12b90 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
12ba0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  o;.          rc 
12bb0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
12bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
12bd0 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
12be0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12bf0 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12c00 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
12c10 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
12c20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
12c30 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12c40 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12c50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12c60 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
12c70 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
12c80 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12c90 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rc) ){.        p
12ca0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12cb0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
12cc0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
12cd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12ce0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
12cf0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
12d00 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
12d10 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
12d20 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ed));..#ifdef SQ
12d30 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12d40 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
12d50 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
12d60 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
12d70 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
12d80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12d90 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20     reserved=1;. 
12da0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
12db0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
12dc0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
12dd0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
12de0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
12df0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
12e00 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
12e10 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
12e20 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
12e30 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
12e40 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
12e50 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
12e60 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
12e70 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
12e80 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
12e90 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
12ea0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12eb0 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12ec0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12ed0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12ee0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12ef0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12f00 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12f10 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12f20 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12f30 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12f40 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
12f50 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
12f60 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
12f70 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
12f80 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
12f90 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
12fa0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12fb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12fc0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12fd0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12fe0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12ff0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
13000 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
13010 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
13020 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
13030 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
13040 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
13050 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
13060 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
13070 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
13080 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
13090 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
130a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
130b0 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61  flock() only rea
130c0 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c  lly support EXCL
130d0 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65  USIVE locks.  We
130e0 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69   track intermedi
130f0 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74  ate.** lock stat
13100 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  es in the sqlite
13110 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  3_file structure
13120 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20  , but all locks 
13130 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f  SHARED or.** abo
13140 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58  ve are really EX
13150 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e  CLUSIVE locks an
13160 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74  d exclude all ot
13170 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72  her processes fr
13180 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65  om.** access the
13190 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
131a0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
131b0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
131c0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
131d0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
131e0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
131f0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
13200 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
13210 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  nt flockLock(sql
13220 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13230 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
13240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13250 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13260 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13270 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
13280 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13290 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
132a0 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
132b0 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
132c0 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
132d0 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
132e0 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
132f0 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
13300 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
13310 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13320 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13330 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13350 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20   }.  .  /* grab 
13360 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
13370 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f  k */.  .  if (ro
13380 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
13390 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
133a0 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
133b0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
133c0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
133d0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
133e0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
133f0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
13400 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
13410 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
13420 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
13430 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
13440 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13450 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
13460 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
13470 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
13480 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
13490 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
134a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
134b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
134c0 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  k;.  }.  OSTRACE
134d0 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
134e0 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %s (flock)\n", 
134f0 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
13500 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
13510 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d   .           rc=
13520 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
13530 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
13540 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
13550 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13560 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63  ERRORS.  if( (rc
13570 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
13580 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
13590 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
135a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
135b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
135c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
135d0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74  _ERRORS */.  ret
135e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
135f0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13600 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13610 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
13620 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
13630 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
13640 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
13650 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
13660 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
13670 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13680 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
13690 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
136a0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
136b0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
136c0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
136d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
136e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
136f0 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63  c int flockUnloc
13700 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13710 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13720 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
13730 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13740 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
13750 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13760 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13770 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13780 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  id=%d (flock)\n"
13790 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
137a0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
137b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
137c0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
137d0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
137e0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
137f0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
13800 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
13810 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13820 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
13830 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
13840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13850 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63    .  /* shared c
13860 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62  an just be set b
13870 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73  ecause we always
13880 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
13890 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c  ve */.  if (eFil
138a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
138b0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
138c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
138d0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
138e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138f0 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65  }.  .  /* no, re
13900 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  ally, unlock. */
13910 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c  .  if( robust_fl
13920 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
13930 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66  CK_UN) ){.#ifdef
13940 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13950 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13960 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13970 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  TE_OK;.#endif /*
13980 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13990 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
139a0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
139b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
139c0 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  CK;.  }else{.   
139d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
139e0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
139f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13a00 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
13a10 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
13a20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
13a30 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
13a40 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
13a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a60 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
13a70 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13a80 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72   NO_LOCK);.    r
13a90 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13aa0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
13ab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
13ac0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
13ad0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
13ae0 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a   && !OS_VXWORK *
13af0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13b00 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
13b10 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d  he flock lock im
13b20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
13b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b40 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b60 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 42 65 67  ************ Beg
13c00 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f  in Named Semapho
13c10 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  re Locking *****
13c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c30 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20  ***.**.** Named 
13c40 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
13c50 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72  g is only suppor
13c60 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ted on VxWorks..
13c70 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
13c80 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
13c90 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f  dot-lock and flo
13ca0 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65  ck in that it re
13cb0 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70  ally only.** sup
13cc0 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20  ports EXCLUSIVE 
13cd0 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61  locking.  Only a
13ce0 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
13cf0 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74  can read or writ
13d00 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
13d10 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65  e file at a time
13d20 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
13d30 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72  potential concur
13d40 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61  rency, but.** ma
13d50 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70  kes the lock imp
13d60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68  lementation much
13d70 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20   easier..*/.#if 
13d80 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a  OS_VXWORKS../*.*
13d90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13da0 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
13db0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
13dc0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
13dd0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
13de0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
13df0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
13e00 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
13e10 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
13e20 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
13e30 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
13e40 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
13e50 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
13e60 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
13e70 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
13e80 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
13e90 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
13ea0 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
13eb0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
13ec0 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73   int semCheckRes
13ed0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13ee0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13ef0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13f00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13f10 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13f20 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13f30 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13f40 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13f50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13f60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13f70 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13f80 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13f90 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13fa0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13fb0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13fc0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13fd0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13fe0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13ff0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
14000 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
14010 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
14020 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
14030 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14040 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
14050 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
14060 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
14070 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
14080 65 2d 3e 70 53 65 6d 3b 0a 20 20 20 20 73 74 72  e->pSem;.    str
14090 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66  uct stat statBuf
140a0 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74  ;..    if( sem_t
140b0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
140c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45   ){.      int tE
140d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
140e0 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21      if( EAGAIN !
140f0 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20  = tErrno ){.    
14100 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
14110 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
14120 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
14130 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14140 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
14150 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
14160 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
14170 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
14180 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65        /* someone
14190 20 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f   else has the lo
141a0 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69  ck when we are i
141b0 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  n NO_LOCK */.   
141c0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
141d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
141e0 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  k < SHARED_LOCK)
141f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14200 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65  lse{.      /* we
14210 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
14220 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a  f we want it */.
14230 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70        sem_post(p
14240 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Sem);.    }.  }.
14250 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14260 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
14270 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c  d (sem)\n", pFil
14280 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
14290 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75  ed));..  *pResOu
142a0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
142b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
142c0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
142d0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
142e0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
142f0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
14300 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14310 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14320 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14330 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14340 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14350 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14360 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14370 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
14380 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
14390 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
143a0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
143b0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
143c0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
143d0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
143e0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
143f0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14400 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14410 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14420 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14430 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14440 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14450 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14460 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14470 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
14480 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
14490 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
144a0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
144b0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
144c0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
144d0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
144e0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
144f0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14500 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14510 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14520 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14530 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14540 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14550 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14560 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14570 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
14580 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c   locks only real
14590 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
145a0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
145b0 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
145c0 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
145d0 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
145e0 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
145f0 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
14600 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
14610 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
14620 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
14630 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
14640 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
14650 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
14660 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
14670 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14680 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14690 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
146a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
146b0 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
146c0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
146d0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
146e0 74 20 73 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  t semLock(sqlite
146f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14700 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14710 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14720 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14730 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 65 6d 5f    int fd;.  sem_
14740 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14750 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14760 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14770 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
14780 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
14790 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
147a0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
147b0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
147c0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
147d0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
147e0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
147f0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
14800 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14810 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14820 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14830 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
14840 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14850 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
14860 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
14870 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
14880 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
14890 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
148a0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
148b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
148c0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
148d0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
148e0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
148f0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
14900 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
14910 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14920 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
14930 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
14940 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14950 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14960 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
14970 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
14980 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
14990 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
149a0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
149b0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
149c0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
149d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
149e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
149f0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
14a00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14a10 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14a20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14a40 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14a50 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
14a60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14a70 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14a80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14a90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14aa0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
14ab0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
14ac0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
14ad0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14ae0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
14af0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
14b00 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
14b10 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
14b20 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
14b30 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
14b40 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14b50 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
14b60 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14b70 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14b80 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
14b90 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
14ba0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14bb0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
14bc0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14bd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14be0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14bf0 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
14c00 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
14c10 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
14c20 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
14c30 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
14c40 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14c50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14c60 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
14c70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14c80 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
14c90 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f  eally unlock. */
14ca0 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74  .  if ( sem_post
14cb0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20  (pSem)==-1 ) {. 
14cc0 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e     int rc, tErrn
14cd0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
14ce0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14cf0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14d00 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14d10 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
14d20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
14d30 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
14d40 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14d50 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
14d60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
14d70 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
14d80 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
14d90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14da0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
14db0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
14dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
14dd0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14de0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
14df0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
14e00 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14e10 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73  xFile*)id;.    s
14e20 65 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  emUnlock(id, NO_
14e30 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14e40 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14e50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14e60 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
14e70 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
14e80 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14e90 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
14ea0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
14eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ec0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14ed0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
14ee0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
14ef0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
14f00 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
14f10 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14f30 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
14f40 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
14f50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 0a  ************/...
14fc0 2f 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 2a 2a 2a 2a  ****************
14fe0 2a 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 0a  ***************.
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 20 42 65 67 69  *********** Begi
15030 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
15040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15060 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
15070 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
15080 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
15090 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
150a0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
150b0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
150c0 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
150d0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
150e0 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
150f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15100 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
15110 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
15120 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
15130 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
15140 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
15150 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
15160 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
15170 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
15180 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
15190 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
151a0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
151b0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
151c0 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
151d0 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
151e0 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
151f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
15200 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
15210 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
15220 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
15230 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
15240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15250 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
15260 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
15270 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15280 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
15290 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
152a0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
152b0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
152c0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
152d0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
152e0 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
152f0 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
15300 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15310 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
15320 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
15330 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
15340 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
15350 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
15360 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
15370 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
15380 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
15390 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
153a0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
153b0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
153c0 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
153d0 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
153e0 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15410 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15420 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15430 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15440 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15450 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
15460 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
15470 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15480 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
15490 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
154a0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
154b0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
154c0 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
154d0 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
154e0 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
154f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15500 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15510 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15520 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15530 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15540 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15550 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15560 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
15570 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
15580 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
15590 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
155a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
155b0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
155c0 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
155d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
155e0 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
155f0 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15600 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15610 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15620 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15630 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15640 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15650 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
15660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15670 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
15680 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
15690 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
156a0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
156b0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
156c0 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
156d0 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
156e0 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
156f0 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15700 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15710 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15720 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15730 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15740 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15750 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15760 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
15770 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
15780 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
15790 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
157a0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
157b0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
157c0 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
157d0 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
157e0 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
157f0 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15800 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15810 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15820 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15830 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15840 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15850 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
15860 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
15870 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
15880 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
15890 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
158a0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
158b0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
158c0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
158d0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
158e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
158f0 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15900 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15910 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15920 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15930 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15940 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15950 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
15960 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
15970 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
15980 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15990 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
159a0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
159b0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
159c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
159d0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
159e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
159f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
15a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15a10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
15a20 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15a30 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15a40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15a50 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15a60 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
15a70 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
15a80 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
15a90 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15aa0 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15ab0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15ac0 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
15ad0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
15ae0 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
15af0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
15b00 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
15b10 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
15b20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15b30 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
15b40 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15b50 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
15b60 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
15b70 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
15b80 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
15b90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15ba0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15bb0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15bc0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15bd0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
15be0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
15bf0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
15c00 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
15c10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
15c20 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15c30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
15c40 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
15c50 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15c60 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15c70 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15c80 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
15c90 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15ca0 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
15cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15cc0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
15cd0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
15ce0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
15cf0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
15d00 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
15d10 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
15d20 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15d30 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15d40 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15d50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
15d60 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
15d70 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15d80 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
15d90 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
15da0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
15db0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
15dc0 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
15dd0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
15de0 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
15df0 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
15e00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
15e10 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
15e20 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15e30 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15e40 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
15e50 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
15e60 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
15e70 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
15e80 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
15e90 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
15ea0 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
15eb0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
15ec0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
15ed0 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
15ee0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15ef0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15f00 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15f10 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
15f20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15f30 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
15f40 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
15f50 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
15f60 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
15f70 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15f80 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
15f90 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
15fa0 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
15fb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
15fc0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15fd0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
15fe0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
15ff0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
16000 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
16010 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
16020 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
16030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16040 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
16050 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
16060 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
16070 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
16080 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
16090 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
160a0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
160b0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
160c0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
160d0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
160e0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
160f0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
16100 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
16110 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
16120 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
16130 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
16140 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
16150 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
16160 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
16170 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
16180 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
16190 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
161a0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
161b0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
161c0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
161d0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
161e0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
161f0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
16200 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
16210 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
16220 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
16230 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
16240 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
16250 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
16260 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
16270 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
16280 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
16290 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
162a0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
162b0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
162c0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
162d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
162e0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
162f0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
16300 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16310 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16320 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
16330 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
16340 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
16350 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
16360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16370 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
16380 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16390 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
163a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
163b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
163c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
163d0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
163e0 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
163f0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
16400 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16410 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
16420 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16430 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16440 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
16450 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16460 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16470 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
16480 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
16490 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
164a0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
164b0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
164c0 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
164d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
164e0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
164f0 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
16500 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
16510 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65 74  e->nShared , get
16520 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  pid()));..  /* I
16530 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16540 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16550 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16560 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
16570 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
16580 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
16590 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
165a0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
165b0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
165c0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
165d0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
165e0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
165f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16600 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
16610 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16620 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
16630 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
16640 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16650 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16660 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16670 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
16680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16690 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
166a0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
166b0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
166c0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
166d0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
166e0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
166f0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
16700 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
16710 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
16720 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
16730 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
16740 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
16750 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
16760 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
16770 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
16780 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
16790 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
167a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
167b0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
167c0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
167d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
167e0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
167f0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16800 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
16810 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
16820 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16830 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16840 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
16850 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
16860 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
16870 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
16880 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
16890 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
168a0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
168b0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
168c0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
168d0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
168e0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
168f0 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
16900 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
16910 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
16920 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
16930 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
16940 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
16950 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16960 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
16970 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
16980 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16990 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
169a0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
169b0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
169c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
169d0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
169e0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
169f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
16a00 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
16a10 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
16a20 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16a30 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
16a40 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
16a50 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
16a60 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
16a70 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
16a80 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
16a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
16aa0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
16ab0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16ac0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
16ad0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
16ae0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
16af0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
16b00 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
16b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
16b20 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
16b30 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
16b40 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
16b50 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
16b60 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
16b70 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
16b80 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16b90 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16ba0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
16bb0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
16bc0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
16bd0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16be0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
16bf0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
16c00 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
16c10 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
16c20 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
16c30 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
16c40 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
16c50 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
16c60 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
16c70 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
16c80 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
16c90 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
16ca0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16cb0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
16cc0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
16cd0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
16ce0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
16cf0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
16d00 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
16d10 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
16d20 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16d30 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
16d40 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
16d50 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
16d60 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
16d70 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
16d80 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
16d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
16da0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
16db0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
16dc0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
16dd0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
16de0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
16df0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
16e00 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
16e10 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
16e20 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
16e30 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
16e40 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
16e50 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
16e60 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
16e70 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
16e80 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
16e90 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
16ea0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
16eb0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
16ec0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
16ed0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
16ee0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
16ef0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
16f00 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
16f10 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
16f20 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
16f30 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
16f40 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
16f50 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
16f60 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
16f70 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
16f80 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
16f90 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
16fa0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
16fb0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
16fc0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
16fd0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16fe0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16ff0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
17000 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
17010 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
17020 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
17030 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17040 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
17050 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
17060 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
17070 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
17080 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
17090 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
170a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
170b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
170c0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
170d0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
170e0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
170f0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
17100 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17110 45 72 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e  Errno = lrc1Errn
17120 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  o;.      rc = lr
17130 63 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c1;.      goto a
17140 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
17150 20 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c   } else if( IS_L
17160 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20  OCK_ERROR(lrc2) 
17170 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72  ){.      rc = lr
17180 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  c2;.      goto a
17190 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
171a0 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31   } else if( lrc1
171b0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20   != SQLITE_OK ) 
171c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
171d0 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1;.    } else {.
171e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
171f0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
17200 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  LOCK;.      pIno
17210 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
17220 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
17230 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17240 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17250 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17260 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e  OCK && pInode->n
17270 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20  Shared>1 ){.    
17280 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
17290 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
172a0 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
172b0 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
172c0 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  s.     ** same p
172d0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
172e0 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
172f0 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
17300 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17320 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
17330 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
17340 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
17350 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
17360 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
17370 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
17380 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
17390 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
173a0 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
173b0 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
173c0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
173d0 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
173e0 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20  eLock );.    if 
173f0 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45  (eFileLock >= RE
17400 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70  SERVED_LOCK && p
17410 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17420 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  < RESERVED_LOCK)
17430 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63   {.        /* Ac
17440 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
17450 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
17460 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
17470 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17480 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
17490 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
174a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69  ;.      if( !fai
174b0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63  led ){.        c
174c0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
174d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
174e0 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69    }.    if (!fai
174f0 6c 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  led && eFileLock
17500 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   == EXCLUSIVE_LO
17510 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41  CK) {.      /* A
17520 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
17530 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  IVE lock */.    
17540 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65      .      /* Re
17550 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20  move the shared 
17560 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69  lock before tryi
17570 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77  ng the range.  w
17580 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20  e'll need to .  
17590 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69      ** reestabli
175a0 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
175b0 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67  ck if we can't g
175c0 65 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63  et the  afpUnloc
175d0 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  k.      */.     
175e0 20 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20   if( !(failed = 
175f0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17600 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17610 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  e, SHARED_FIRST 
17620 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
17630 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64             pInod
17640 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31  e->sharedByte, 1
17650 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 0)) ){.       
17660 20 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53   int failed2 = S
17670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17680 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70    /* now attemmp
17690 74 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63  t to get the exc
176a0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67  lusive lock rang
176b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  e */.        fai
176c0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
176d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
176e0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
176f0 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20  FIRST, .        
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
17720 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 1);.        
17730 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66  if( failed && (f
17740 61 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c  ailed2 = afpSetL
17750 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17760 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
17790 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65   + pInode->share
177a0 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b  dByte, 1, 1)) ){
177b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
177c0 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20  n't reestablish 
177d0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  the shared lock.
177e0 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64    Sqlite can't d
177f0 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20  eal, this is.   
17800 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74         ** a crit
17810 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20  ical I/O error. 
17820 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
17830 20 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69        rc = ((fai
17840 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  led & SQLITE_IOE
17850 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
17860 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a  ERR) ? failed2 :
17870 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17880 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
17890 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  CK;.          go
178a0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
178b0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
178c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
178d0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20   rc = failed; . 
178e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
178f0 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
17900 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
17910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
17920 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17930 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
17940 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
17950 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
17960 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
17970 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
17980 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
17990 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
179a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
179b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
179c0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
179d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
179e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
179f0 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f   }.  .afp_end_lo
17a00 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
17a10 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
17a20 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
17a30 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70  s %s (afp)\n", p
17a40 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
17a50 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
17a60 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
17a70 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
17a80 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
17a90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17aa0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
17ab0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
17ac0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
17ad0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
17ae0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
17af0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17b00 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
17b10 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
17b20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17b30 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
17b40 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
17b50 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
17b60 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17b70 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17b80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17b90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
17ba0 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b  ic int afpUnlock
17bb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17bc0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
17bd0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17be0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
17bf0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
17c00 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
17c10 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
17c20 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
17c30 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
17c40 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
17c50 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
17c60 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
17c70 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72  ;.  int skipShar
17c80 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
17c90 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
17ca0 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23   h = pFile->h;.#
17cb0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
17cc0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
17cd0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
17ce0 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
17cf0 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
17d00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
17d10 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
17d20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17d30 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
17d40 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
17d50 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
17d60 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
17d70 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20    getpid()));.. 
17d80 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
17d90 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
17da0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
17db0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
17dc0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
17dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17de0 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
17df0 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
17e00 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
17e10 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17e20 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
17e30 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
17e40 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
17e50 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
17e60 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
17e70 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
17e80 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d  eLock );.    Sim
17e90 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
17ea0 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c  gn(1);.    Simul
17eb0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
17ec0 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74  1) ).    Simulat
17ed0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17ee0 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  );.    .#ifdef S
17ef0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
17f00 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67  /* When reducing
17f10 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61   a lock such tha
17f20 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  t other processe
17f30 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20  s can start.    
17f40 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  ** reading the d
17f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61  atabase file aga
17f60 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
17f70 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  at the.    ** tr
17f80 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
17f90 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66  r was updated if
17fa0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
17fb0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
17fc0 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20   file changed.  
17fd0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
17fe0 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f  on counter is no
17ff0 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a  t updated,.    *
18000 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
18010 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ons to the same 
18020 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72  file might not r
18030 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20  ealize that.    
18040 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  ** the file has 
18050 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63  changed and henc
18060 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77  e might not know
18070 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a   to flush their.
18080 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54      ** cache.  T
18090 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c  he use of a stal
180a0 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64  e cache can lead
180b0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
180c0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ruption..    */.
180d0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
180e0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
180f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18100 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74  | pFile->dbUpdat
18110 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
18120 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43  || pFile->transC
18130 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20  ntrChng==1 );.  
18140 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
18150 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
18160 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  if.    .    if( 
18170 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18180 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18190 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
181a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
181b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
181c0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
181d0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
181e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
181f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
18200 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
18210 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
18220 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20  Shared>1) ){.   
18230 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d       /* only re-
18240 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
18250 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63  ared lock if nec
18260 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20  essary */.      
18270 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b    int sharedLock
18280 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49  Byte = SHARED_FI
18290 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
182a0 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20  edByte;.        
182b0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
182c0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
182d0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
182e0 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
182f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
18300 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64        skipShared
18310 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
18320 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18330 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
18340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50  le->eFileLock>=P
18350 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
18360 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
18370 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
18380 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
18390 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29  DING_BYTE, 1, 0)
183a0 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28  ;.    } .    if(
183b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
183c0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
183d0 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
183e0 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65  K && context->re
183f0 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20  served ){.      
18400 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18410 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18420 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
18430 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18440 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a      if( !rc ){ .
18450 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
18460 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a  >reserved = 0; .
18470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18490 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
184a0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
184b0 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
184c0 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e  d>1)){.      pIn
184d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
184e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
184f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
18500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
18510 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
18520 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  K ){..    /* Dec
18530 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
18540 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
18550 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
18560 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
18570 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
18580 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
18590 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
185a0 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
185b0 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
185c0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ck..    */.    u
185d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
185e0 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
185f0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
18600 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18610 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  te;.    pInode->
18620 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
18630 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
18640 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
18650 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
18660 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53  nign(1);.      S
18670 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
18680 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53  h=(-1) ).      S
18690 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
186a0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
186b0 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29  f( !skipShared )
186c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  {.        rc = a
186d0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
186e0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
186f0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
18700 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
18710 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29  .      if( !rc )
18720 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
18730 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18740 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
18750 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18760 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
18770 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18790 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
187a0 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61  nLock--;.      a
187b0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
187c0 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Lock>=0 );.     
187d0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
187e0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
187f0 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
18800 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d  (pFile);.      }
18810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
18820 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18830 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18840 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
18850 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
18860 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
18870 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
18880 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
18890 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
188a0 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
188b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
188c0 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  fpClose(sqlite3_
188d0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
188e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
188f0 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
18900 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18910 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18920 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b  d;.    afpUnlock
18930 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
18940 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
18950 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
18960 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
18970 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
18980 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
18990 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
189a0 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
189b0 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
189c0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
189d0 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
189e0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
189f0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
18a00 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
18a10 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
18a20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
18a30 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e   to pInode->aPen
18a40 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62  ding.  It will b
18a50 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
18a60 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20  closed when.    
18a70 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f    ** the last lo
18a80 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
18a90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65       */.      se
18aa0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
18ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
18ac0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
18ad0 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ile);.    sqlite
18ae0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
18af0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
18b00 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
18b10 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75  xFile(id);.    u
18b20 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
18b30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18b40 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
18b50 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18b60 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18b70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18b80 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
18b90 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
18ba0 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18bb0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
18bc0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
18bd0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
18be0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
18bf0 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
18c00 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
18c10 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
18c20 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20  ilable.  If you 
18c30 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f  don't compile fo
18c40 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68  r a mac, then th
18c50 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20  e "unix-afp".** 
18c60 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  VFS is not avail
18c70 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  able..**.*******
18c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
18c90 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f  nd of the AFP lo
18ca0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18cb0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
18cc0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 4e 46 53 20  ***** Begin NFS 
18d90 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
18da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18db0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64  ********/..#if d
18dc0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18dd0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18de0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18df0 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
18e00 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18e10 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
18e20 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
18e30 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
18e40 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  k. ** must be ei
18e50 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
18e60 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
18e70 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
18e80 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
18e90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18ea0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
18eb0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
18ec0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
18ed0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
18ee0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18ef0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
18f00 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
18f10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18f20 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72   eFileLock){.  r
18f30 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
18f40 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
18f50 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   1);.}..#endif /
18f60 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18f70 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18f80 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18f90 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
18fa0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
18fb0 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
18fc0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
18fd0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18fe0 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18ff0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
19000 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
19010 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
19020 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
19030 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a  available.  .**.
19040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19050 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
19060 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
19070 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
19080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
190a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a  **************/.
190e0 0a 2f 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 2a 2a  ****************
19100 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
19140 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71  * Non-locking sq
19150 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
19160 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
19170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
19190 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
191a0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
191b0 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64  s for all method
191c0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c  s of the .** sql
191d0 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74  ite3_file object
191e0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
191f0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e  locking methods.
19200 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a    The locking.**
19210 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65   methods were de
19220 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f  fined in divisio
19230 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f  ns above (one lo
19240 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72  cking method per
19250 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20  .** division).  
19260 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68  Those methods th
19270 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f  at are common to
19280 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64   all locking mod
19290 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72  es.** are gather
192a0 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74   together into t
192b0 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  his division..*/
192c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
192d0 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65  the offset passe
192e0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
192f0 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72  argument, then r
19300 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65  ead cnt .** byte
19310 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74  s into pBuf. Ret
19320 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19330 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19340 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a   read..**.** NB:
19350 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20    If you define 
19360 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45  USE_PREAD or USE
19370 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69  _PREAD64, then i
19380 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20  t might also.** 
19390 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
193a0 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
193b0 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20  URCE to be 500. 
193c0 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f   This varies fro
193d0 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20  m.** one system 
193e0 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e  to another.  Sin
193f0 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  ce SQLite does n
19400 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ot define USE_PR
19410 45 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66  EAD.** any any f
19420 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
19430 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
19440 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
19450 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
19460 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
19470 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
19480 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
19490 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
194a0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
194b0 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
194c0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
194d0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
194e0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
194f0 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
19500 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
19510 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19520 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
19530 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
19540 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
19550 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
19560 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
19570 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
19580 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
19590 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
195a0 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
195b0 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
195c0 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
195d0 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66 66 66    cnt &= 0x1ffff
195e0 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69  ;.  do{.#if defi
195f0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19600 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
19610 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19620 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
19630 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19640 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19650 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19660 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20  READ64).    got 
19670 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e  = osPread64(id->
19680 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
19690 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
196a0 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
196b0 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20  = -1 );.#else.  
196c0 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73    newOffset = ls
196d0 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eek(id->h, offse
196e0 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
196f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19700 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29  r( newOffset-- )
19710 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19720 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20  set!=offset ){. 
19730 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73       if( newOffs
19740 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  et == -1 ){.    
19750 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19760 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19770 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 65   errno;.      }e
19780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 28 75  lse{.        ((u
19790 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
197a0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  stErrno = 0;.   
197b0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
197c0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
197d0 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
197e0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
197f0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19800 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19810 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19820 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19830 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19840 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19850 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19860 3b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  ;.      ((unixFi
19870 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
19880 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
19890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
198a0 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  se if( got>0 ){.
198b0 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74        cnt -= got
198c0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
198d0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69  = got;.      pri
198e0 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  or += got;.     
198f0 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28   pBuf = (void*)(
19900 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75  got + (char*)pBu
19910 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  f);.    }.  }whi
19920 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54  le( got>0 );.  T
19930 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
19940 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
19950 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
19960 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u\n",.          
19970 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69    id->h, got+pri
19980 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72  or, offset-prior
19990 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
199a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b  );.  return got+
199b0 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  prior;.}../*.** 
199c0 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
199d0 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
199e0 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
199f0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
19a00 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
19a10 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
19a20 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
19a30 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19a40 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
19a50 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
19a60 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
19a70 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
19a80 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
19a90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
19aa0 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
19ab0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19ac0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
19ad0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
19ae0 72 74 28 20 69 64 20 29 3b 0a 0a 20 20 2f 2a 20  rt( id );..  /* 
19af0 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74  If this is a dat
19b00 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
19b10 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65  a journal, maste
19b20 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d  r-journal or tem
19b30 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68  p.  ** file), th
19b40 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c  e bytes in the l
19b50 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f  ocking range sho
19b60 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61  uld never be rea
19b70 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f  d or written. */
19b80 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
19b90 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d   pFile->pUnused=
19ba0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
19bb0 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
19bc0 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
19bd0 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
19be0 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
19bf0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
19c00 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
19c10 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
19c20 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
19c30 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
19c40 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
19c50 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
19c60 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
19c70 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
19c80 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
19c90 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
19ca0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
19cb0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
19cc0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
19cd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
19ce0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
19cf0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
19d00 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
19d10 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
19d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19d40 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
19d50 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
19d60 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
19d70 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
19d80 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
19d90 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
19da0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
19db0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
19dc0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
19dd0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
19de0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
19df0 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
19e00 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
19e10 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
19e20 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
19e30 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
19e40 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
19e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19e60 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
19e70 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
19e80 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
19e90 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
19ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19eb0 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
19ec0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
19ed0 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f  Errno = 0; /* no
19ee0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
19ef0 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
19f00 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
19f10 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
19f20 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
19f30 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
19f40 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
19f50 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
19f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
19f70 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
19f80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
19f90 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
19fa0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
19fb0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
19fc0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
19fd0 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
19fe0 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
19ff0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1a000 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1a010 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1a020 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1a030 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1a040 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1a050 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1a060 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1a070 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1a080 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1a090 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1a0a0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1a0b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1a0c0 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1a0d0 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1a100 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1a110 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1a140 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1a150 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1a160 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1a170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a180 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1a190 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1a1a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1a1b0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1a1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1a1d0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1a1e0 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1a1f0 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1a220 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1a230 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1a240 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a260 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1a270 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1a280 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1a290 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1a2a0 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1a2b0 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1a2c0 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1a2d0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1a2e0 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69 74  do{ rc = osPwrit
1a2f0 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1a300 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28  , iOff); }while(
1a310 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1a320 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64  EINTR );.#elif d
1a330 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a340 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f  64).  do{ rc = o
1a350 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42  sPwrite64(fd, pB
1a360 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1a370 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1a380 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23  errno==EINTR);.#
1a390 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69  else.  do{.    i
1a3a0 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b  64 iSeek = lseek
1a3b0 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f  (fd, iOff, SEEK_
1a3c0 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
1a3d0 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b  teIOError( iSeek
1a3e0 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  -- );..    if( i
1a3f0 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20  Seek!=iOff ){.  
1a400 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f 20      if( piErrno 
1a410 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69 53  ) *piErrno = (iS
1a420 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20  eek==-1 ? errno 
1a430 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  : 0);.      retu
1a440 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1a450 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a460 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a470 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a480 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a490 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1a4a0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a4b0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1a4c0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a4d0 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1a4e0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a4f0 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ..  if( rc<0 && 
1a500 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1a510 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1a520 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1a530 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1a540 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1a550 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1a560 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1a570 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1a580 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a590 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1a5a0 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1a5b0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1a5c0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1a5d0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1a5e0 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1a5f0 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1a600 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1a610 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1a620 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1a630 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1a640 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1a650 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1a660 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1a670 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1a680 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1a690 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1a6a0 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1a6b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1a6c0 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1a6d0 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1a6e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1a6f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1a700 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1a710 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1a720 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1a730 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1a740 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a750 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1a760 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1a770 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1a780 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1a790 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a7a0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1a7b0 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1a7c0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1a7d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1a7e0 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1a7f0 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1a800 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1a810 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1a820 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1a830 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1a840 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1a850 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1a860 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1a870 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1a880 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1a890 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a  ile->pUnused==0.
1a8a0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1a8b0 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1a8c0 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1a8d0 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1a8e0 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1a8f0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a900 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20  E_DEBUG.  /* If 
1a910 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1a920 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1a930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1a940 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1a950 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
1a960 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
1a970 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
1a980 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
1a990 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  an a.  ** normal
1a9a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1a9b0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20  then record the 
1a9c0 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61  fact that the da
1a9d0 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20  tabase.  ** has 
1a9e0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
1a9f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1aa00 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64  nter is modified
1aa10 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20  , record that.  
1aa20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a  ** fact too..  *
1aa30 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69  /.  if( pFile->i
1aa40 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a  nNormalWrite ){.
1aa50 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
1aa60 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  ate = 1;  /* The
1aa70 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1aa80 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  en modified */. 
1aa90 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32     if( offset<=2
1aaa0 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e  4 && offset+amt>
1aab0 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =27 ){.      int
1aac0 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20   rc;.      char 
1aad0 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20  oldCntr[4];.    
1aae0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1aaf0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1ab00 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65    rc = seekAndRe
1ab10 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c  ad(pFile, 24, ol
1ab20 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20  dCntr, 4);.     
1ab30 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ab40 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1ab50 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65   if( rc!=4 || me
1ab60 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28  mcmp(oldCntr, &(
1ab70 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d  (char*)pBuf)[24-
1ab80 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29  offset], 4)!=0 )
1ab90 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1aba0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1abb0 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e   1;  /* The tran
1abc0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1abd0 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  has changed */. 
1abe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1abf0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1ac00 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1ac10 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1ac20 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1ac30 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1ac40 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1ac50 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1ac60 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1ac70 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1ac80 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1ac90 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1aca0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1acb0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1acc0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1acd0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1ace0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1acf0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1ad00 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1ad10 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1ad20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ad30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ad40 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1ad50 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1ad60 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1ad70 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1ad80 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ad90 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1ada0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1adb0 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1adc0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1add0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1ade0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1adf0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1ae00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c  }.#endif..  whil
1ae10 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
1ae20 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1ae30 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c  e(pFile, offset,
1ae40 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
1ae50 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1ae60 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1ae70 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1ae80 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1ae90 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1aea0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1aeb0 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1aec0 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1aed0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1aee0 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1aef0 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1af00 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  >0 ){.    if( wr
1af10 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1af20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1af30 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1af40 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1af50 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1af60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1af70 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1af80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1af90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1afa0 6f 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20  o = 0; /* not a 
1afb0 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1afc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1afd0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1afe0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1aff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1b000 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1b010 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1b020 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1b030 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1b040 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1b050 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1b060 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1b070 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1b080 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1b090 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1b0a0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1b0b0 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1b0c0 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1b0d0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1b0e0 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1b0f0 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1b100 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1b110 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1b120 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1b130 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1b140 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1b150 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1b160 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1b170 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1b180 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1b190 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1b1a0 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1b1b0 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1b1c0 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1b1d0 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1b1e0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
1b1f0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b200 66 64 61 74 61 73 79 6e 63 29 0a 23 20 64 65 66  fdatasync).# def
1b210 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
1b220 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
1b230 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
1b240 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
1b250 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
1b260 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
1b270 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
1b280 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1b290 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
1b2a0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1b2b0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
1b2c0 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
1b2d0 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
1b2e0 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
1b2f0 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
1b300 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b310 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
1b320 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1b330 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  C 0.#endif.../*.
1b340 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73  ** The fsync() s
1b350 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20  ystem call does 
1b360 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65  not work as adve
1b370 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a  rtised on many.*
1b380 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20  * unix systems. 
1b390 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
1b3a0 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61  rocedure is an a
1b3b0 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a  ttempt to make.*
1b3c0 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72  * it work better
1b3d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1b3e0 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f  TE_NO_SYNC macro
1b3f0 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73   disables all fs
1b400 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73  ync()s.  This is
1b410 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74   useful.** for t
1b420 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77  esting when we w
1b430 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75  ant to run throu
1b440 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  gh the test suit
1b450 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f  e quickly..** Yo
1b460 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61  u are strongly a
1b470 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20  dvised *not* to 
1b480 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49  deploy with SQLI
1b490 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e  TE_NO_SYNC.** en
1b4a0 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20  abled, however, 
1b4b0 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54  since with SQLIT
1b4c0 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65  E_NO_SYNC enable
1b4d0 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a  d, an OS crash.*
1b4e0 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
1b4f0 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63  re will likely c
1b500 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62  orrupt the datab
1b510 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1b520 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20  SQLite sets the 
1b530 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66  dataOnly flag if
1b540 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b550 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67   file is unchang
1b560 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ed..** The idea 
1b570 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20  behind dataOnly 
1b580 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  is that it shoul
1b590 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65  d only write the
1b5a0 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a   file content.**
1b5b0 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68   to disk, not th
1b5c0 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c  e inode.  We onl
1b5d0 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69  y set dataOnly i
1b5e0 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  f the file size 
1b5f0 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  is .** unchanged
1b600 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20   since the file 
1b610 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20  size is part of 
1b620 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65  the inode.  Howe
1b630 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27  ver, .** Ted Ts'
1b640 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20  o tells us that 
1b650 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1b660 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
1b670 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20  inode if the.** 
1b680 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68  file size has ch
1b690 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79  anged.  The only
1b6a0 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65   real difference
1b6b0 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79   between fdatasy
1b6c0 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e  nc().** and fsyn
1b6d0 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75  c(), Ted tells u
1b6e0 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61  s, is that fdata
1b6f0 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20  sync() will not 
1b700 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f  flush the.** ino
1b710 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20  de if the mtime 
1b720 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65  or owner or othe
1b730 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74  r inode attribut
1b740 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e  es have changed.
1b750 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65  .** We only care
1b760 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
1b770 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74  size, not the ot
1b780 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75  her file attribu
1b790 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61  tes, so.** as fa
1b7a0 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63  r as SQLite is c
1b7b0 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61  oncerned, an fda
1b7c0 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61  tasync() is alwa
1b7d0 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20  ys adequate..** 
1b7e0 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  So, we always us
1b7f0 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66  e fdatasync() if
1b800 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
1b810 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a  , regardless of.
1b820 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1b830 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61  the dataOnly fla
1b840 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1b850 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20   full_fsync(int 
1b860 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  fd, int fullSync
1b870 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
1b880 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1b890 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22   The following "
1b8a0 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f  ifdef/elif/else/
1b8b0 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20  " block has the 
1b8c0 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  same structure a
1b8d0 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62  s.  ** the one b
1b8e0 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c  elow. It is repl
1b8f0 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65  icated here sole
1b900 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74  ly to avoid clut
1b910 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20  tering .  ** up 
1b920 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69  the real code wi
1b930 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41  th the UNUSED_PA
1b940 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73  RAMETER() macros
1b950 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1b960 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55  LITE_NO_SYNC.  U
1b970 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b980 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
1b990 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1b9a0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b9b0 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1b9c0 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c  .#elif HAVE_FULL
1b9d0 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50  FSYNC.  UNUSED_P
1b9e0 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1b9f0 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  y);.#else.  UNUS
1ba00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1ba10 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1ba20 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1ba30 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nly);.#endif..  
1ba40 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
1ba50 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
1ba60 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
1ba70 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
1ba80 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
1ba90 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
1baa0 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
1bab0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
1bac0 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
1bad0 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
1bae0 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
1baf0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
1bb00 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1bb10 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
1bb20 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1bb30 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
1bb40 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
1bb50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1bb60 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
1bb70 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
1bb80 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
1bb90 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
1bba0 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
1bbb0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1bbc0 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
1bbd0 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f  _OK;.#elif HAVE_
1bbe0 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
1bbf0 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
1bc00 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c  rc = osFcntl(fd,
1bc10 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
1bc20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1bc30 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
1bc40 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
1bc50 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
1bc60 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
1bc70 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a   an fsync()..  *
1bc80 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
1bc90 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
1bca0 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
1bcb0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
1bcc0 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20   ** file system 
1bcd0 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
1bce0 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
1bcf0 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
1bd00 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74  ** isn't support
1bd10 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
1bd20 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
1bd30 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
1bd40 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77   ** and (for now
1bd50 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
1bd60 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
1bd70 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
1bd80 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62  l.  .  ** It'd b
1bd90 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
1bda0 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
1bdb0 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
1bdc0 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63  oid .  ** the fc
1bdd0 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
1bde0 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
1bdf0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ed..  */.  if( r
1be00 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
1be10 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e  d);..#elif defin
1be20 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1be30 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f  /* fdatasync() o
1be40 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79  n HFS+ doesn't y
1be50 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c  et flush the fil
1be60 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61  e size if it cha
1be70 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  nged correctly. 
1be80 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79   ** so currently
1be90 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74   we default to t
1bea0 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65  he macro that re
1beb0 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e  defines fdatasyn
1bec0 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a  c to fsync.  */.
1bed0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1bee0 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20  ;.#else .  rc = 
1bef0 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23  fdatasync(fd);.#
1bf00 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1bf10 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72  if( rc==-1 && er
1bf20 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a  rno==ENOTSUP ){.
1bf30 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
1bf40 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
1bf50 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1bf60 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
1bf70 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1bf80 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  lif HAVE_FULLFSY
1bf90 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f  NC */..  if( OS_
1bfa0 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20  VXWORKS && rc!= 
1bfb0 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  -1 ){.    rc = 0
1bfc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1bfd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
1bfe0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1bff0 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
1c000 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
1c010 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
1c020 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1c030 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1c040 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
1c050 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
1c060 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1c070 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1c080 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
1c090 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
1c0a0 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
1c0b0 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
1c0c0 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
1c0d0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
1c0e0 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
1c0f0 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  ** The directory
1c100 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c110 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c   is used for onl
1c120 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f  y one thing - to
1c130 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69  .** fsync() a di
1c140 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20  rectory to make 
1c150 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69  sure file creati
1c160 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20  on and deletion 
1c170 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c  events.** are fl
1c180 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ushed to disk.  
1c190 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20  Such fsyncs are 
1c1a0 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65  not needed on ne
1c1b0 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e  wer.** journalin
1c1c0 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62  g filesystems, b
1c1d0 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ut are required 
1c1e0 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73  on older filesys
1c1f0 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
1c200 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1c210 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
1c220 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c   the xSetSysCall
1c230 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54   interface..** T
1c240 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76  he ability to ov
1c250 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74  erride this rout
1c260 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e  ine was added in
1c270 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a   support of the.
1c280 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  ** chromium sand
1c290 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20  box.  Opening a 
1c2a0 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73  directory is a s
1c2b0 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65  ecurity risk (we
1c2c0 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f   are.** told) so
1c2d0 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72   making it overr
1c2e0 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74  ideable allows t
1c2f0 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64  he chromium sand
1c300 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63  box to.** replac
1c310 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1c320 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e  ith a harmless n
1c330 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74  o-op.  To make t
1c340 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1c350 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20   no-op, replace 
1c360 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74  it with a stub t
1c370 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49  hat returns SQLI
1c380 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73  TE_OK but leaves
1c390 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20  .** *pFd set to 
1c3a0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1c3b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  r..**.** If SQLI
1c3c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c3d0 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  d, the caller is
1c3e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1c3f0 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20   closing.** the 
1c400 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c410 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65  *pFd using close
1c420 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1c430 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
1c440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1c450 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29  ename, int *pFd)
1c460 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
1c470 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61  t fd = -1;.  cha
1c480 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50  r zDirname[MAX_P
1c490 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73  ATHNAME+1];..  s
1c4a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c4b0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44  MAX_PATHNAME, zD
1c4c0 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46  irname, "%s", zF
1c4d0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ilename);.  for(
1c4e0 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  ii=(int)strlen(z
1c4f0 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26  Dirname); ii>1 &
1c500 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d  & zDirname[ii]!=
1c510 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66  '/'; ii--);.  if
1c520 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44  ( ii>0 ){.    zD
1c530 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30  irname[ii] = '\0
1c540 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ';.    fd = robu
1c550 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1c560 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1c570 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ARY, 0);.    if(
1c580 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
1c590 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49  OSTRACE(("OPENDI
1c5a0 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64  R %-3d %s\n", fd
1c5b0 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20  , zDirname));.  
1c5c0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d    }.  }.  *pFd =
1c5d0 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66   fd;.  return (f
1c5e0 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75  d>=0?SQLITE_OK:u
1c5f0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1c600 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1c610 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61  , "open", zDirna
1c620 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  me));.}../*.** M
1c630 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1c640 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1c650 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1c660 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1c670 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1c680 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1c690 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1c6a0 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1c6b0 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1c6c0 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1c6d0 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1c6e0 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1c6f0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1c700 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1c710 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1c720 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1c730 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1c740 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1c750 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1c760 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1c770 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1c780 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1c790 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1c7a0 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1c7b0 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1c7c0 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1c7d0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1c7e0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1c7f0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1c800 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1c810 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1c820 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1c830 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1c840 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1c850 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1c860 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1c870 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1c880 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1c890 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1c8a0 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1c8b0 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1c8c0 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1c8d0 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1c8e0 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1c8f0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1c900 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1c910 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1c920 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c930 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1c940 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1c950 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c960 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1c970 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1c980 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1c990 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1c9a0 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1c9b0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1c9c0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1c9d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1c9e0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1c9f0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1ca00 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1ca10 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1ca20 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1ca30 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1ca40 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1ca50 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1ca60 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1ca70 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1ca80 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1ca90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1caa0 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1cab0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1cac0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1cad0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1cae0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1caf0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1cb00 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1cb10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1cb20 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1cb30 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1cb40 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1cb50 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1cb60 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1cb70 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1cb80 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1cb90 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1cba0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1cbb0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1cbc0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1cbd0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
1cbe0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1cbf0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1cc00 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1cc10 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1cc20 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1cc30 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1cc40 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1cc50 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1cc60 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1cc70 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1cc80 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1cc90 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1cca0 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1ccb0 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1ccc0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1ccd0 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1cce0 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1ccf0 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1cd00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cd10 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1cd20 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1cd30 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1cd40 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1cd50 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1cd60 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1cd70 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1cd80 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1cd90 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1cda0 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1cdb0 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1cdc0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1cdd0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1cde0 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1cdf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ce00 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
1ce10 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1ce20 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1ce30 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1ce40 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1ce50 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1ce60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ce70 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
1ce80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ce90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1cea0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1ceb0 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1cec0 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1ced0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1cee0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1cef0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1cf00 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1cf10 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1cf20 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1cf30 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1cf40 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1cf50 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1cf60 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1cf70 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1cf80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1cf90 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1cfa0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1cfb0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cfc0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1cfd0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1cfe0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1cff0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1d000 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1d010 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1d020 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1d030 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1d040 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1d050 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1d060 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1d070 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1d080 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1d090 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1d0a0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1d0b0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
1d0c0 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1d0d0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1d0e0 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1d0f0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d100 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1d110 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1d120 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 28 6f  ate(pFile->h, (o
1d130 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69  ff_t)nByte);.  i
1d140 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
1d150 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1d160 65 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  errno;.    retur
1d170 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d180 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d190 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1d1a0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d1b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1d1c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d1d0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d1e0 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1d1f0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1d200 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1d210 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1d220 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1d230 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1d240 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1d250 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1d260 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1d270 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1d280 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1d290 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1d2a0 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1d2b0 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1d2c0 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d2d0 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1d2e0 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1d2f0 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1d300 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1d310 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1d320 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1d330 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1d340 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1d350 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1d360 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1d370 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1d380 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1d390 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1d3a0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
1d3b0 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
1d3c0 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
1d3d0 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
1d3e0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
1d3f0 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
1d400 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
1d410 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
1d420 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
1d430 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
1d440 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
1d450 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
1d460 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
1d470 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
1d480 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
1d490 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
1d4a0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
1d4b0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1d4c0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
1d4d0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  e;.    }..    re
1d4e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d4f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
1d500 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
1d510 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
1d520 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
1d530 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1d540 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1d550 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
1d560 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
1d570 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1d580 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1d590 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
1d5a0 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
1d5b0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69  ->h, &buf);.  Si
1d5c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d5d0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21  c=1 );.  if( rc!
1d5e0 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  =0 ){.    ((unix
1d5f0 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1d600 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1d610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d620 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1d630 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1d640 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1d650 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1d660 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1d670 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1d680 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1d690 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1d6a0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1d6b0 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1d6c0 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1d6d0 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1d6e0 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1d6f0 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1d700 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1d710 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1d720 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1d730 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1d740 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1d750 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1d760 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1d770 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1d780 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1d790 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1d7a0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1d7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d7c0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1d7d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1d7e0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1d7f0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1d800 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1d810 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1d820 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1d830 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1d840 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1d850 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1d860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d870 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1d880 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1d890 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1d8a0 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1d8b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d8c0 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1d8d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1d8e0 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1d8f0 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1d900 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
1d910 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
1d920 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
1d930 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
1d940 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
1d950 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
1d960 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
1d970 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
1d980 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
1d990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d9a0 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
1d9b0 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
1d9c0 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
1d9d0 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
1d9e0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1d9f0 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1da20 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1da30 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da50 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1da60 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1da70 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1da80 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1da90 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 20 72  le->h, &buf) ) r
1daa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dab0 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20 20 6e  RR_FSTAT;..    n
1dac0 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70  Size = ((nByte+p
1dad0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29  File->szChunk-1)
1dae0 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   / pFile->szChun
1daf0 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
1db00 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  unk;.    if( nSi
1db10 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73  ze>(i64)buf.st_s
1db20 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69  ize ){..#if defi
1db30 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
1db40 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
1db50 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1db60 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  E.      /* The c
1db70 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e  ode below is han
1db80 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  dling the return
1db90 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c   value of osFall
1dba0 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a  ocate() .      *
1dbb0 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73  * correctly. pos
1dbc0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69  ix_fallocate() i
1dbd0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65  s defined to "re
1dbe0 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75  turns zero on su
1dbf0 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a  ccess, .      **
1dc00 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d   or an error num
1dc10 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22  ber on  failure"
1dc20 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67  . See the manpag
1dc30 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  e for details. *
1dc40 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b  /.      int err;
1dc50 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
1dc60 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f     err = osFallo
1dc70 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62  cate(pFile->h, b
1dc80 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a  uf.st_size, nSiz
1dc90 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  e-buf.st_size);.
1dca0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72        }while( er
1dcb0 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  r==EINTR );.    
1dcc0 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75    if( err ) retu
1dcd0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1dce0 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20  WRITE;.#else.   
1dcf0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20     /* If the OS 
1dd00 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f  does not have po
1dd10 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c  six_fallocate(),
1dd20 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73 74 20   fake it. First 
1dd30 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 74 72  use.      ** ftr
1dd40 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65 74 20  uncate() to set 
1dd50 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 74  the file size, t
1dd60 68 65 6e 20 77 72 69 74 65 20 61 20 73 69 6e 67  hen write a sing
1dd70 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20 20 20  le byte to.     
1dd80 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62 79 74   ** the last byt
1dd90 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1dda0 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e  within the exten
1ddb0 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 69 73  ded region. This
1ddc0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
1ddd0 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75 65 20   same technique 
1dde0 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 74 6f  used by glibc to
1ddf0 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73 69 78   implement posix
1de00 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20 20 20  _fallocate().   
1de10 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65 6d 73     ** on systems
1de20 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
1de30 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61  e a real falloca
1de40 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  te() system call
1de50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1de60 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1de70 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1de80 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1de90 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1dea0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1dec0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1ded0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1dee0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1def0 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1df00 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  nSize) ){.      
1df10 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1df20 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
1df30 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1df40 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1df50 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1df60 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1df70 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1df80 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20   }.      iWrite 
1df90 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20  = ((buf.st_size 
1dfa0 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42  + 2*nBlk - 1)/nB
1dfb0 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20  lk)*nBlk-1;.    
1dfc0 20 20 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c    while( iWrite<
1dfd0 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  nSize ){.       
1dfe0 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65   int nWrite = se
1dff0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1e000 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1e010 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1e020 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1e030 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1e040 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72  ITE;.        iWr
1e050 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20  ite += nBlk;.   
1e060 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1e070 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 46 69  }.  }..  if( pFi
1e080 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1e090 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1e0a0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e0b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1e0c0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e0d0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1e0e0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1e0f0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1e100 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  e) ){.        pF
1e110 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1e120 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
1e130 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1e140 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e150 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1e160 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1e170 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1e180 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
1e190 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1e1a0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
1e1b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1e1c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1e1e0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
1e1f0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
1e200 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
1e210 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
1e220 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
1e230 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1e240 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
1e250 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1e260 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
1e270 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
1e280 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
1e290 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
1e2a0 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
1e2b0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
1e2c0 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
1e2d0 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
1e2e0 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
1e2f0 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
1e300 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
1e310 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
1e320 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1e330 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
1e340 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
1e350 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
1e360 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1e370 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
1e380 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1e390 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
1e3a0 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
1e3b0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
1e3c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1e3d0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
1e3e0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1e3f0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1e400 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1e410 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1e420 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1e430 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1e440 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1e450 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1e460 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1e470 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1e480 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1e490 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1e4a0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e4b0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1e4c0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1e4d0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1e4e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1e4f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e500 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e510 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
1e520 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1e530 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1e540 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1e550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e560 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e570 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e580 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1e590 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1e5a0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1e5b0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1e5c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e5d0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e5e0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e5f0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e600 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e610 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e620 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e630 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e640 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e650 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e660 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1e670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e680 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1e690 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1e6a0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1e6b0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e6c0 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e6d0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1e6e0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e6f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e710 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1e720 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e730 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1e740 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e750 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1e760 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e790 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1e7a0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1e7b0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1e7c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e7d0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1e7e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e7f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e810 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1e820 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1e830 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1e840 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e850 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  c( pFile->pVfs->
1e860 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
1e870 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
1e880 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
1e890 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
1e8a0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1e8b0 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
1e8c0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1e8d0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
1e8e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1e8f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e900 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e910 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1e920 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
1e930 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
1e940 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
1e950 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
1e960 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1e970 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
1e980 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
1e990 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1e9a0 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20  xMmap;.      }. 
1e9b0 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67       *(i64*)pArg
1e9c0 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1e9d0 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28  zeMax;.      if(
1e9e0 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a   newLimit>=0 ){.
1e9f0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1ea00 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
1ea10 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
1ea20 66 28 20 6e 65 77 4c 69 6d 69 74 3c 70 46 69 6c  f( newLimit<pFil
1ea30 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 20 70 46  e->mmapSize ) pF
1ea40 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
1ea50 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
1ea60 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1ea70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ea80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1ea90 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
1eaa0 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
1eab0 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
1eac0 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
1ead0 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
1eae0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1eaf0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
1eb00 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
1eb10 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
1eb20 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
1eb30 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
1eb40 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
1eb50 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
1eb60 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
1eb70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eb80 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1eb90 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
1eba0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
1ebb0 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
1ebc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ebd0 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
1ebe0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1ebf0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1ec00 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1ec10 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
1ec20 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
1ec30 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73  OXYFILE:.    cas
1ec40 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
1ec50 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
1ec60 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
1ec70 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
1ec80 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
1ec90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1eca0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1ecb0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1ecc0 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20  __APPLE__) */.  
1ecd0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ece0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1ecf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ed00 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1ed10 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1ed20 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1ed30 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1ed40 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1ed50 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1ed60 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1ed70 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1ed80 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1ed90 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1eda0 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1edb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1edc0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1edd0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1ede0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1edf0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1ee00 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1ee10 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1ee20 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1ee30 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1ee40 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1ee50 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1ee60 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1ee70 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23  e for both..*/.#
1ee80 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  ifndef __QNXNTO_
1ee90 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _ .static int un
1eea0 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1eeb0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
1eec0 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
1eed0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1eee0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1eef0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1ef00 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  _SIZE;.}.#endif.
1ef10 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1ef20 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20  wing version of 
1ef30 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29  unixSectorSize()
1ef40 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f   is optimized fo
1ef50 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66  r QNX..*/.#ifdef
1ef60 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63   __QNXNTO__.#inc
1ef70 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62  lude <sys/dcmd_b
1ef80 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  lk.h>.#include <
1ef90 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73  sys/statvfs.h>.s
1efa0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
1efb0 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1efc0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
1efd0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1efe0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1eff0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74   if( pFile->sect
1f000 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20  orSize == 0 ){. 
1f010 20 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66     struct statvf
1f020 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
1f030 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66   .    /* Set def
1f040 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75  aults for non-su
1f050 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74  pported filesyst
1f060 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ems */.    pFile
1f070 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
1f080 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1f090 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70  CTOR_SIZE;.    p
1f0a0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1f0b0 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
1f0c0 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66  .    if( fstatvf
1f0d0 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49  s(pFile->h, &fsI
1f0e0 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20  nfo) == -1 ) {. 
1f0f0 20 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c       return pFil
1f100 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  e->sectorSize;. 
1f110 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73     }..    if( !s
1f120 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1f130 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20  asetype, "tmp") 
1f140 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
1f150 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1f160 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1f170 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f180 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f190 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
1f1a0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b  E_IOCAP_ATOMIC4K
1f1b0 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20   |       /* All 
1f1c0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77  ram filesystem w
1f1d0 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f1e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f1f0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f200 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f210 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f220 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f230 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f260 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f270 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f280 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f290 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f2a0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f2b0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f2c0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f2f0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f300 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f310 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
1f320 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f330 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20  , "etfs") ){.   
1f340 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1f350 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1f360 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1f370 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f380 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1f390 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73      /* etfs clus
1f3a0 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20  ter size writes 
1f3b0 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1f3c0 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65        (pFile->se
1f3d0 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
1f3e0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1f3f0 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20  OMIC512) |.     
1f400 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f410 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1f420 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1f430 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1f440 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1f480 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1f490 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f4a0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f4b0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f4c0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f4d0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f500 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f510 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f520 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
1f530 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1f540 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22  basetype, "qnx6"
1f550 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f560 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f570 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f580 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f590 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f5a0 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
1f5b0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20  TE_IOCAP_ATOMIC 
1f5c0 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  |         /* All
1f5d0 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74   filesystem writ
1f5e0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f5f0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f600 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1f610 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1f620 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1f630 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f660 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1f670 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1f680 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f690 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1f6a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1f6b0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1f6c0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1f700 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1f710 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1f720 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1f730 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1f740 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20  "qnx4") ){.     
1f750 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f760 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1f770 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1f780 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f790 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f7a0 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
1f7b0 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
1f7c0 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
1f7d0 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
1f7e0 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
1f7f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f800 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f810 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
1f820 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
1f830 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f840 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f850 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f860 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f870 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f8a0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1f8b0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1f8c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f8d0 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
1f8e0 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29  setype, "dos") )
1f8f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f900 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f910 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f920 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f930 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f940 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
1f950 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
1f960 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
1f970 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
1f980 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
1f990 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1f9a0 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1f9b0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1f9c0 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
1f9d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f9e0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1f9f0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1fa00 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1fa10 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1fa50 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1fa60 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1fa70 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  {.      pFile->d
1fa80 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1fa90 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1faa0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1fab0 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20  IC512 |      /* 
1fac0 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69  blocks are atomi
1fad0 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
1fae0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1faf0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1fb00 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1fb10 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1fb20 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1fb50 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1fb60 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1fb70 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73    }.  }.  /* Las
1fb80 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63  t chance verific
1fb90 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ation.  If the s
1fba0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74  ector size isn't
1fbb0 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35   a multiple of 5
1fbc0 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  12.  ** then it 
1fbd0 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20  isn't valid.*/. 
1fbe0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74   if( pFile->sect
1fbf0 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20  orSize % 512 != 
1fc00 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
1fc10 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1fc20 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70  stics = 0;.    p
1fc30 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fc40 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
1fc50 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
1fc60 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c   }.  return pFil
1fc70 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d  e->sectorSize;.}
1fc80 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58  .#endif /* __QNX
1fc90 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NTO__ */../*.** 
1fca0 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
1fcb0 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1fcc0 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  s for the file..
1fcd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69  **.** This VFS i
1fce0 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75  s set up to retu
1fcf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
1fd00 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1fd10 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a  ITE by default..
1fd20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  ** However, that
1fd30 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72   choice is contr
1fd40 61 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74  aversial since t
1fd50 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75  echnically the u
1fd60 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c  nderlying.** fil
1fd70 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  e system does no
1fd80 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65  t always provide
1fd90 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77   powersafe overw
1fda0 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65  rites.  (In othe
1fdb0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65  r.** words, afte
1fdc0 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65  r a power-loss e
1fdd0 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74  vent, parts of t
1fde0 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72  he file that wer
1fdf0 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74  e never.** writt
1fe00 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  en might end up 
1fe10 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20  being altered.) 
1fe20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53   However, non-PS
1fe30 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76  OW behavior is v
1fe40 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72  ery,.** very rar
1fe50 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e  e.  And assertin
1fe60 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c  g PSOW makes a l
1fe70 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69  arge reduction i
1fe80 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  n the amount.** 
1fe90 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20  of required I/O 
1fea0 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20  for journaling, 
1feb0 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70  since a lot of p
1fec0 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e  adding is elimin
1fed0 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c  ated..**  Hence,
1fee0 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45   while POWERSAFE
1fef0 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e  _OVERWRITE is on
1ff00 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65   by default, the
1ff10 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e  re is a file-con
1ff20 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  trol.** availabl
1ff30 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
1ff40 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70   and URI query p
1ff50 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62  arameter availab
1ff60 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
1ff70 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
1ff80 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1ff90 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1ffa0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1ffb0 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
1ffc0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1ffd0 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65  nt rc = 0;.#ifde
1ffe0 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69  f __QNXNTO__.  i
1fff0 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65  f( p->sectorSize
20000 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72  ==0 ) unixSector
20010 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d  Size(id);.  rc =
20020 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63   p->deviceCharac
20030 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69  teristics;.#endi
20040 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46  f.  if( p->ctrlF
20050 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
20060 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c  PSOW ){.    rc |
20070 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  = SQLITE_IOCAP_P
20080 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20090 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TE;.  }.  return
200a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
200b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
200c0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
200d0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
200e0 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   an shared memor
200f0 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a  y buffer.  .**.*
20100 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
20110 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
20120 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77  rence the same w
20130 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74  al-index, each t
20140 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73  hread.** has its
20150 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a   own unixShm obj
20160 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
20170 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  l point to a sin
20180 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20  gle instance.** 
20190 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  of this unixShmN
201a0 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  ode object.  In 
201b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
201c0 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f  h wal-index is o
201d0 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e  pened.** only on
201e0 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
201f0 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53  **.** Each unixS
20200 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
20210 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
20220 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65  single unixInode
20230 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  Info object..** 
20240 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63  We could coalesc
20250 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e  e this object in
20260 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  to unixInodeInfo
20270 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64  , but that would
20280 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f   mean.** every o
20290 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f  pen file that do
202a0 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65  es not use share
202b0 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68  d memory (in oth
202c0 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a  er words, most.*
202d0 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f  * open files) wo
202e0 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72  uld have to carr
202f0 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78  y around this ex
20300 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  tra information.
20310 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78    So.** the unix
20320 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
20330 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
20340 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78  ter to this unix
20350 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a  ShmNode object.*
20360 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68  * and the unixSh
20370 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
20380 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65  created only whe
20390 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  n needed..**.** 
203a0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
203b0 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
203c0 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
203d0 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
203e0 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
203f0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
20400 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
20410 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
20420 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20       nRef.**.** 
20430 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
20440 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
20450 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
20460 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
20470 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
20480 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
20490 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75  e.**.** Either u
204a0 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  nixShmNode.mutex
204b0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
204c0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
204d0 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78  f==0 and.** unix
204e0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
204f0 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
20500 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
20510 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
20520 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
20530 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
20540 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78  ShmNode {.  unix
20550 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
20560 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e  e;     /* unixIn
20570 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e  odeInfo that own
20580 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20  s this SHM node 
20590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
205a0 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
205b0 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
205c0 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
205d0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
205e0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
205f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d  * Name of the mm
20600 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
20610 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
20620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
20630 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
20640 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  or */.  int szRe
20650 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
20660 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
20670 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
20680 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65  ons */.  u16 nRe
20690 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
206a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
206b0 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
206c0 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79  .  u8 isReadonly
206d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
206e0 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e   True if read-on
206f0 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ly */.  char **a
20700 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
20710 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
20720 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  apped shared-mem
20730 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
20740 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
20750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20760 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
20770 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
20780 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
20790 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
207a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
207b0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
207c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
207d0 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
207e0 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
207f0 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
20800 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20810 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
20820 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
20830 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
20840 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20850 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
20860 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
20870 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
20880 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
20890 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
208a0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
208b0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  };../*.** Struct
208c0 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
208d0 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
208e0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
208f0 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
20900 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
20910 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
20920 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20930 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
20940 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
20950 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
20960 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
20970 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
20980 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69  er:.**.**    uni
20990 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20  xShm.pFile.**   
209a0 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a   unixShm.id.**.*
209b0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
209c0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
209d0 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e  e.  The unixShm.
209e0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
209f0 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
20a00 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
20a10 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
20a20 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ds..*/.struct un
20a30 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68  ixShm {.  unixSh
20a40 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20a50 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
20a60 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f  rlying unixShmNo
20a70 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  de object */.  u
20a80 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  nixShm *pNext;  
20a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
20aa0 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74  t unixShm with t
20ab0 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e  he same unixShmN
20ac0 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
20ad0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
20ae0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
20af0 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
20b00 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
20b10 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b30 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
20b40 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73  ction within its
20b50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
20b60 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
20b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
20b80 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
20b90 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
20ba0 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
20bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20bc0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
20bd0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a  ocks held */.};.
20be0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
20bf0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
20c00 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
20c10 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
20c20 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
20c30 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
20c40 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
20c50 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
20c60 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
20c70 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
20c80 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
20c90 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
20ca0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
20cb0 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
20cc0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
20cd0 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
20ce0 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
20cf0 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
20d00 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
20d10 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
20d20 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
20d30 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
20d40 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
20d50 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
20d60 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
20d70 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 2c  mNode *pShmNode,
20d80 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
20d90 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
20da0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
20db0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
20dc0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Type,          /
20dd0 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c  * F_UNLCK, F_RDL
20de0 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a  CK, or F_WRLCK *
20df0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
20e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20e10 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
20e20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f  locking range */
20e30 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
20e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20e50 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
20e60 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
20e70 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
20e80 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
20e90 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
20ea0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
20eb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20ec0 4f 4b 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  OK;   /* Result 
20ed0 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
20ee0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
20ef0 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
20f00 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
20f10 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
20f20 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
20f30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20f40 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
20f50 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
20f60 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
20f70 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
20f80 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
20f90 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
20fa0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
20fb0 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
20fc0 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
20fd0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
20fe0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
20ff0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
21000 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21010 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
21020 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
21030 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
21040 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
21050 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
21060 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
21070 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
21080 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
21090 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
210a0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
210b0 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
210c0 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
210d0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
210e0 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
210f0 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
21100 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
21110 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
21120 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
21130 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
21140 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
21150 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
21160 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
21170 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21180 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
21190 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
211a0 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
211b0 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  = (1<<(ofst+n)) 
211c0 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69  - (1<<ofst);.  i
211d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
211e0 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   ){.    if( lock
211f0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
21200 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21210 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  "unlock %d ok", 
21220 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
21230 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
21240 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
21250 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
21260 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
21270 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
21280 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
21290 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
212a0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20  (("read-lock %d 
212b0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
212c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
212d0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
212e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
212f0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
21300 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
21310 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21320 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21330 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21340 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21350 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
21360 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
21370 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
21380 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
21390 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
213a0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
213b0 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  e{.    if( lockT
213c0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
213d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
213e0 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  unlock %d failed
213f0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
21400 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
21410 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
21420 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
21430 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
21440 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21450 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
21460 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
21470 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21480 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66  "write-lock %d f
21490 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
214a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52      }.  }.  OSTR
214b0 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61  ACE((" - afterwa
214c0 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22  rds %03x,%03x\n"
214d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68  ,.           pSh
214e0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
214f0 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63  k, pShmNode->exc
21500 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e  lMask));.  }.#en
21510 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
21520 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 0a 2f 2a  ;        .}.../*
21530 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
21540 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
21550 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
21560 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21570 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21580 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21590 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
215a0 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
215b0 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
215c0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
215d0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
215e0 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
215f0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
21600 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
21610 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
21620 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
21630 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
21640 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
21650 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21660 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21670 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
21680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
21690 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
216a0 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
216b0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
216c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
216d0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
216e0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
216f0 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
21700 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
21710 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
21720 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
21730 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21740 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21750 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
21760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21770 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21780 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
21790 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
217a0 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
217b0 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
217c0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
217d0 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
217e0 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
217f0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
21800 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21810 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
21820 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d   Open a shared-m
21830 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
21840 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20  iated with open 
21850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
21860 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70  bFd.  .** This p
21870 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d  articular implem
21880 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
21890 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
218a0 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65 64  ** The file used
218b0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68   to implement sh
218c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69  ared-memory is i
218d0 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
218e0 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f  tory.** as the o
218f0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
21900 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  e and has the sa
21910 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
21920 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  pen database.** 
21930 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d  file with the "-
21940 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64 65  shm" suffix adde
21950 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  d.  For example,
21960 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
21970 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f   file.** is "/ho
21980 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
21990 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c  db" then the fil
219a0 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  e that is create
219b0 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a  d and mmapped.**
219c0 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f   for shared memo
219d0 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ry will be calle
219e0 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  d "/home/user1/c
219f0 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20  onfig.db-shm".  
21a00 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61  .**.** Another a
21a10 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f  pproach to is to
21a20 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64   use files in /d
21a30 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74  ev/shm or /dev/t
21a40 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65  mp or an.** some
21a50 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75   other tmpfs mou
21a60 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c  nt. But if a fil
21a70 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  e in a different
21a80 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72   directory.** fr
21a90 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
21aa0 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68  file is used, th
21ab0 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63 63  en differing acc
21ac0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  ess permissions.
21ad0 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29  ** or a chroot()
21ae0 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77 6f   might cause two
21af0 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
21b00 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sses on the same
21b10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20  .** database to 
21b20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69 66  end up using dif
21b30 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72  ferent files for
21b40 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d   shared memory -
21b50 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61   .** meaning tha
21b60 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77  t their memory w
21b70 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20  ould not really 
21b80 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73 75  be shared - resu
21b90 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61  lting.** in data
21ba0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
21bb0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
21bc0 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20  this tmpfs file 
21bd0 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20  usage.** can be 
21be0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
21bf0 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
21c00 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
21c10 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a  TORY="/dev/shm".
21c20 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76 61  ** or the equiva
21c30 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f  lent.  The use o
21c40 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d  f the SQLITE_SHM
21c50 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69  _DIRECTORY compi
21c60 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f  le-time.** optio
21c70 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  n results in an 
21c80 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69  incompatible bui
21c90 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62  ld of SQLite;  b
21ca0 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a  uilds of SQLite.
21cb0 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69 66  ** that with dif
21cc0 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48  fering SQLITE_SH
21cd0 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74 74  M_DIRECTORY sett
21ce0 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ings attempt to 
21cf0 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  use the.** same 
21d00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
21d10 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
21d20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
21d30 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  ion will likely.
21d40 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53  ** result. The S
21d50 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
21d60 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
21d70 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69   option is consi
21d80 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70  dered.** "unsupp
21d90 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67  orted" and may g
21da0 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74 75  o away in a futu
21db0 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73  re SQLite releas
21dc0 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  e..**.** When op
21dd0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
21de0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
21df0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
21e00 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
21e10 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
21e20 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
21e30 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
21e40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
21e50 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
21e60 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
21e70 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
21e80 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
21e90 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
21ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67  *.** If the orig
21eb0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
21ec0 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75 73  le (pDbFd) is us
21ed0 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78  ing the "unix-ex
21ee0 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20  cl" VFS.** that 
21ef0 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78  means that an ex
21f00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
21f10 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
21f20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a  base file and.**
21f30 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
21f40 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62 6c  rocesses are abl
21f50 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  e to read or wri
21f60 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  te the database.
21f70 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73    In.** that cas
21f80 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61  e, we do not rea
21f90 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64 20  lly need shared 
21fa0 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72  memory.  No shar
21fb0 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c  ed memory.** fil
21fc0 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
21fd0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
21fe0 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74   will be simulat
21ff0 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d  ed with heap mem
22000 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
22010 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65  nt unixOpenShare
22020 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65  dMemory(unixFile
22030 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
22040 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  ct unixShm *p = 
22050 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
22060 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
22070 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
22080 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f  struct unixShmNo
22090 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
220a0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
220b0 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
220c0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
220f0 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  de */.  unixInod
22100 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
22110 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
22120 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20  node of fd */.  
22130 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c 65 6e 61  char *zShmFilena
22140 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
22150 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
22160 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
22170 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
22180 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
22190 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
221a0 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
221b0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
221c0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
221d0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
221e0 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
221f0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
22200 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
22210 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
22220 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22230 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
22240 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
22250 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
22260 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
22270 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
22280 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
22290 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
222a0 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
222b0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
222c0 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
222d0 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
222e0 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
222f0 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
22300 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
22310 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
22320 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
22330 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
22340 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
22350 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
22360 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22380 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
22390 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
223a0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c   */..    /* Call
223b0 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67 75   fstat() to figu
223c0 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69  re out the permi
223d0 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61  ssions on the da
223e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
223f0 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73      ** a new *-s
22400 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  hm file is creat
22410 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77  ed, an attempt w
22420 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63  ill be made to c
22430 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  reate it.    ** 
22440 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70 65  with the same pe
22450 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  rmissions..    *
22460 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61  /.    if( osFsta
22470 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74  t(pDbFd->h, &sSt
22480 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d 3e 62  at) && pInode->b
22490 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
224a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
224b0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
224c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
224d0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
224e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
224f0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
22500 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
22510 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
22520 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
22530 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
22540 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
22550 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 44 62 46  (int)strlen(pDbF
22560 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  d->zPath);.#endi
22570 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
22580 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
22590 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
225a0 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  e) + nShmFilenam
225b0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  e );.    if( pSh
225c0 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mNode==0 ){.    
225d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
225e0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
225f0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
22600 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
22610 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65  ShmNode, 0, size
22620 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53  of(*pShmNode)+nS
22630 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  hmFilename);.   
22640 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   zShmFilename = 
22650 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
22660 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ame = (char*)&pS
22670 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65  hmNode[1];.#ifde
22680 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
22690 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74  ECTORY.    sqlit
226a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d  e3_snprintf(nShm
226b0 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69  Filename, zShmFi
226c0 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
226e0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
226f0 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d  RY "/sqlite-shm-
22700 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x-%x",.        
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33               (u3
22720 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20  2)sStat.st_ino, 
22730 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65  (u32)sStat.st_de
22740 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71  v);.#else.    sq
22750 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22760 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
22770 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  mFilename, "%s-s
22780 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
22790 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
227a0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
227b0 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
227c0 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
227d0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
227e0 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
227f0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
22800 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
22810 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
22820 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
22830 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
22840 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
22850 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
22860 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
22870 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
22880 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
22890 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
228a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
228b0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
228c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
228d0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
228e0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
228f0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
22900 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
22910 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  T;.      if( sql
22920 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
22930 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
22940 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
22950 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65  ) ){.        ope
22960 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c  nFlags = O_RDONL
22970 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  Y;.        pShmN
22980 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
22990 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
229a0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
229b0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
229c0 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46  mFilename, openF
229d0 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f  lags, (sStat.st_
229e0 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
229f0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
22a00 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
22a10 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
22a20 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
22a30 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
22a40 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
22a50 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f         goto shm_
22a60 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20  open_err;.      
22a70 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
22a80 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
22a90 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20  unning as root, 
22aa0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
22ab0 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20  he SHM file.    
22ac0 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79    ** is owned by
22ad0 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74   the same user t
22ae0 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69  hat owns the ori
22af0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20  ginal database. 
22b00 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
22b10 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
22b20 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74  l owner will not
22b30 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e   be able to conn
22b40 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ect..      */.  
22b50 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 70 53 68      osFchown(pSh
22b60 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e  mNode->h, sStat.
22b70 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74  st_uid, sStat.st
22b80 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20  _gid);.  .      
22b90 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
22ba0 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
22bb0 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
22bc0 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
22bd0 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
22be0 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
22bf0 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
22c00 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
22c10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22c20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
22c30 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
22c40 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
22c50 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
22c60 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
22c70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
22c80 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
22c90 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
22ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22cb0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
22cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
22cd0 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
22ce0 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
22cf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22d00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
22d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22d20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
22d30 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
22d40 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c  hmNode, F_RDLCK,
22d50 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
22d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22d70 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
22d80 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22d90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
22da0 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
22db0 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
22dc0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
22dd0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
22de0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
22df0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
22e00 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
22e10 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
22e20 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
22e30 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
22e40 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
22e50 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
22e60 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
22e70 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
22e80 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
22e90 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
22ea0 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
22eb0 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
22ec0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
22ed0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
22ee0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
22ef0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
22f00 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
22f10 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
22f20 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
22f30 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
22f40 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
22f50 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
22f60 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
22f70 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
22f80 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
22f90 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
22fa0 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
22fb0 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
22fc0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
22fd0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
22fe0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
22ff0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23000 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23010 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
23020 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
23030 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
23040 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
23050 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23060 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23080 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
23090 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
230a0 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
230b0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
230c0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
230d0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
230e0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
230f0 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
23100 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
23110 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
23120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23130 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23140 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
23150 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23160 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23170 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
23180 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
23190 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
231a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
231b0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
231c0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
231d0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
231e0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
231f0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23200 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
23210 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
23220 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
23230 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
23240 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23250 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23260 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23270 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23280 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
23290 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
232a0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
232b0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
232c0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
232d0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
232e0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
232f0 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
23300 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
23310 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
23320 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
23330 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23340 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23350 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23360 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23370 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23380 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23390 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
233a0 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
233b0 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
233c0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
233d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
233e0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
233f0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
23400 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
23410 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
23420 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
23430 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
23440 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
23450 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23460 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23470 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
23480 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23490 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
234a0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
234b0 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
234c0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
234d0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
234e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
234f0 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
23500 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
23510 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
23520 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
23530 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
23540 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23560 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23570 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
23580 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23590 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
235a0 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
235b0 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
235e0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
235f0 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23600 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23610 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23620 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23630 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23640 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23650 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23660 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23670 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
23680 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23690 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  _OK;..  /* If th
236a0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
236b0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
236c0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
236d0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
236e0 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  if( pDbFd->pShm=
236f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  =0 ){.    rc = u
23700 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
23710 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
23720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23730 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23740 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d   }..  p = pDbFd-
23750 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
23760 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
23770 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23780 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
23790 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
237a0 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
237b0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
237c0 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
237d0 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gion==0 );.  ass
237e0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
237f0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
23800 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
23810 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
23820 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
23830 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
23840 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
23850 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
23860 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
23870 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
23880 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  );..  if( pShmNo
23890 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65  de->nRegion<=iRe
238a0 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
238b0 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238d0 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
238e0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
238f0 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
23900 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
23910 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
23920 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
23930 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
23940 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
23950 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
23960 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
23970 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
23980 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
23990 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
239a0 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
239b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
239c0 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
239d0 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
239e0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
239f0 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
23a00 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
23a10 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
23a20 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
23a30 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
23a40 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
23a50 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
23a60 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
23a70 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
23a80 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
23a90 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
23aa0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
23ab0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
23ac0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
23ad0 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
23ae0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
23af0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
23b00 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
23b10 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
23b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
23b30 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
23b40 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
23b50 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
23b60 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
23b70 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
23b80 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
23b90 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
23ba0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23bb0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
23bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
23bd0 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
23be0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
23bf0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
23c00 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
23c10 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
23c20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
23c30 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
23c40 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
23c50 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
23c60 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
23c70 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
23c80 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
23c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
23ca0 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
23cb0 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
23cc0 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
23cd0 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
23ce0 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
23cf0 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
23d00 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
23d10 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
23d20 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
23d30 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
23d40 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
23d50 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
23d60 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
23d70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
23d80 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
23d90 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
23da0 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
23db0 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
23dc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
23dd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
23de0 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
23df0 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
23e00 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
23e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23e20 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
23e30 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
23e40 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
23e50 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
23e60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23e70 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
23e80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
23e90 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
23ea0 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
23eb0 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
23ec0 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
23ed0 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
23ee0 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
23ef0 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
23f00 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30  pgsz-1, "", 1, 0
23f10 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
23f20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
23f30 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f   *zFile = pShmNo
23f40 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  de->zFilename;. 
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
23f60 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
23f70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
23f80 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46  IZE, "write", zF
23f90 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
23fa0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23fb0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
23fc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
23fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fe0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23ff0 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
24000 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
24010 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
24020 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
24030 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
24040 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  = (char **)sqlit
24050 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
24060 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
24070 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
24080 2b 31 29 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  +1)*sizeof(char 
24090 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
240a0 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
240b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
240c0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
240d0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
240e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
240f0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
24100 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
24110 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  le(pShmNode->nRe
24120 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a  gion<=iRegion){.
24130 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d        void *pMem
24140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d  ;.      if( pShm
24150 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
24160 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d        pMem = osM
24170 6d 61 70 28 30 2c 20 73 7a 52 65 67 69 6f 6e 2c  map(0, szRegion,
24180 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68  .            pSh
24190 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
241a0 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20  y ? PROT_READ : 
241b0 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
241c0 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20  RITE, .         
241d0 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70     MAP_SHARED, p
241e0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65  ShmNode->h, szRe
241f0 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f  gion*(i64)pShmNo
24200 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20  de->nRegion.    
24210 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
24220 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
24230 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
24240 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
24250 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
24260 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
24270 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
24280 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24290 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
242a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
242b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
242c0 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
242d0 6d 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29  malloc(szRegion)
242e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
242f0 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
24300 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24310 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
24320 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24340 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c      memset(pMem,
24350 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
24360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
24370 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
24380 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24390 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 20  n] = pMem;.     
243a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
243b0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
243c0 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
243d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
243e0 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
243f0 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
24400 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
24410 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
24420 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
24430 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
24440 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
24450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
24460 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
24470 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
24480 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
24490 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
244a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
244b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
244c0 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
244d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
244e0 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
244f0 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
24500 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
24510 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
24520 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
24530 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
24540 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
24550 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
24560 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
24570 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
24580 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
24590 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
245a0 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
245b0 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
245c0 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
245d0 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
245e0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
245f0 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
24600 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
24610 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
24620 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
24630 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
24640 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24650 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
24660 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
24670 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24690 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
246a0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
246b0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
246e0 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
246f0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
24700 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
24710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24720 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
24730 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
24740 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
24750 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
24760 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
24770 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
24780 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
24790 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
247a0 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
247b0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
247c0 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
247d0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
247e0 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
24810 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
24820 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
24830 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
24840 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
24850 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
24860 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
24870 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24880 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
24890 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
248a0 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
248b0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248d0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
248e0 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
248f0 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
24900 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
24910 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
24920 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
24930 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
24940 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
24960 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
24970 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
24980 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
24990 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
249a0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
249b0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
249c0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
249d0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
249e0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
249f0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
24a00 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
24a10 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
24a20 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
24a30 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
24a40 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
24a50 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
24a60 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
24a70 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
24a80 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
24a90 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
24aa0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
24ab0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
24ac0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
24ad0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
24ae0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
24af0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
24b00 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
24b10 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
24b20 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
24b30 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
24b40 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
24b50 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
24b60 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
24b70 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
24b80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
24b90 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
24ba0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
24bb0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
24bc0 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
24bd0 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
24be0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
24bf0 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
24c00 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
24c10 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
24c20 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
24c30 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
24c40 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
24c50 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
24c60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
24c70 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
24c80 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
24c90 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
24ca0 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
24cb0 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
24cc0 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
24cd0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
24ce0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
24cf0 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
24d00 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
24d10 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
24d20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
24d30 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
24d40 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
24d50 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
24d60 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
24d70 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
24d80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24d90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
24da0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
24db0 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
24dc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
24de0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
24df0 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
24e00 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
24e10 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
24e20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
24e30 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
24e40 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
24e50 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
24e60 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
24e70 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
24e80 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
24e90 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
24ea0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
24eb0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
24ec0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
24ed0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
24ee0 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
24ef0 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
24f00 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
24f10 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
24f20 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
24f30 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
24f40 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
24f50 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
24f60 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
24f70 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
24f80 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
24f90 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
24fa0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
24fb0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
24fc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
24fd0 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
24fe0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
24ff0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
25000 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
25010 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
25020 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
25030 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25050 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
25060 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
25070 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
25080 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
25090 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
250a0 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
250b0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
250c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
250d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
250e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
250f0 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
25100 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
25110 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25130 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
25140 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
25150 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
25160 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
25170 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
25180 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
25190 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
251a0 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
251b0 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
251c0 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
251d0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
251e0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
251f0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
25200 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
25210 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
25220 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
25230 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
25240 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
25250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25260 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
25270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25280 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
25290 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
252a0 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
252b0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
252c0 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
252d0 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
252e0 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
252f0 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
25300 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
25310 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25330 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
25340 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
25350 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
25360 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
25370 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25390 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
253a0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
253b0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
253c0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
253d0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
253e0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
253f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25400 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25410 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
25420 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
25430 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
25440 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
25450 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
25460 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
25470 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
25480 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25490 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
254a0 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
254b0 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
254c0 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
254d0 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
254e0 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
254f0 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
25500 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
25510 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
25520 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
25530 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
25540 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
25550 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
25560 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
25570 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
255a0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
255b0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
255c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
255d0 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
255e0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
255f0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
25610 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
25620 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
25630 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
25640 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
25650 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
25660 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
25670 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
25680 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
25690 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
256a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
256b0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
256c0 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
256d0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
256e0 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
256f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25700 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
25710 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25720 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
25730 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
25740 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
25750 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
25760 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
25770 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
25780 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
257b0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
257c0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
257d0 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
257e0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
257f0 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
25800 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
25810 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25830 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25840 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
25850 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
25860 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
25870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25880 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
25890 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
258a0 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
258b0 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
258c0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
258d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
258e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
258f0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
25900 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
25910 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
25920 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
25930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
25940 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
25950 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
25960 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
25970 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
25980 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
25990 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
259a0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
259b0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
259c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
259d0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
259e0 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
259f0 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
25a00 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
25a10 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
25a20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
25a30 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
25a40 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
25a50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
25a60 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
25a70 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
25a80 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
25a90 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
25aa0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
25ab0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
25ac0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
25ad0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
25ae0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
25af0 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
25b00 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
25b10 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
25b20 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
25b30 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
25b40 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
25b50 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
25b60 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
25b70 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
25b80 30 20 29 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68  0 ) osUnlink(pSh
25b90 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
25ba0 29 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75  );.    unixShmPu
25bb0 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
25bc0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
25bd0 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
25be0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
25bf0 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
25c00 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
25c10 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
25c20 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
25c30 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
25c40 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
25c50 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
25c60 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
25c70 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
25c80 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
25c90 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79  currently memory
25ca0 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66   mapped, unmap f
25cb0 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74  ile pFd..*/.stat
25cc0 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
25cd0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
25ce0 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pFd){.  assert( 
25cf0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
25d00 30 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  0 );.#if SQLITE_
25d10 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
25d20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
25d30 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
25d40 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
25d50 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
25d60 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
25d70 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
25d80 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
25d90 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
25da0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
25db0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  tual = 0;.  }.#e
25dc0 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ndif.}..#if SQLI
25dd0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
25de0 3e 30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  >0./*.** Return 
25df0 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
25e00 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
25e10 69 6e 74 20 75 6e 69 78 47 65 74 50 61 67 65 73  int unixGetPages
25e20 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 48  ize(void){.#if H
25e30 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 72 65 74  AVE_MREMAP.  ret
25e40 75 72 6e 20 35 31 32 3b 0a 23 65 6c 69 66 20 64  urn 512;.#elif d
25e50 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52  efined(_BSD_SOUR
25e60 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74  CE).  return get
25e70 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73  pagesize();.#els
25e80 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  e.  return (int)
25e90 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45  sysconf(_SC_PAGE
25ea0 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  SIZE);.#endif.}.
25eb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25ec0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
25ed0 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
25ee0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
25ef0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
25f00 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
25f10 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
25f20 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
25f30 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
25f40 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
25f50 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
25f60 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
25f70 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
25f80 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
25f90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
25fa0 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
25fb0 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
25fc0 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
25fd0 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
25fe0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
25ff0 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
26000 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
26010 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
26020 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
26030 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26040 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
26050 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
26060 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
26070 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
26080 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
26090 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
260a0 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
260b0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
260c0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
260d0 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
260e0 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
260f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
26100 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
26110 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
26120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26130 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
26140 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
26150 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
26180 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
26190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
261a0 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
261b0 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
261e0 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
261f0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
26200 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
26210 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
26220 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
26230 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
26240 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
26250 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
26260 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
26270 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
26280 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
26290 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
262a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
262b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
262c0 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
262d0 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
262e0 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26300 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
26310 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
26320 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
26330 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
26340 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
26350 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
26360 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
26370 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
26380 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
26390 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
263a0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
263b0 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
263c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
263d0 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
263e0 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72  .  if( (pFd->ctr
263f0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
26400 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66  E_RDONLY)==0 ) f
26410 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49  lags |= PROT_WRI
26420 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  TE;..  if( pOrig
26430 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
26440 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 75 6e  t szSyspage = un
26450 69 78 47 65 74 50 61 67 65 73 69 7a 65 28 29 3b  ixGetPagesize();
26460 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
26470 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  = (pFd->mmapSize
26480 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31   & ~(szSyspage-1
26490 29 29 3b 0a 20 20 20 20 75 38 20 2a 70 52 65 71  ));.    u8 *pReq
264a0 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
264b0 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
264c0 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
264d0 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
264e0 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
264f0 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
26500 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
26510 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
26520 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
26530 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
26540 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
26550 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
26560 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
26570 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
26580 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
26590 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
265a0 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
265b0 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
265c0 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
265d0 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
265e0 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
265f0 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
26600 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
26610 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
26620 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
26630 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
26640 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
26650 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
26660 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
26670 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
26680 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
26690 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
266a0 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
266b0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
266c0 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
266d0 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
266e0 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
266f0 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
26700 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
26710 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
26720 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
26730 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
26740 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
26750 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
26760 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
26770 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
26780 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
26790 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
267a0 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
267b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
267c0 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
267d0 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
267e0 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
267f0 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
26800 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
26810 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
26820 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
26830 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
26840 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
26850 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
26860 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
26870 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
26880 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
26890 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
268a0 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
268b0 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
268c0 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
268d0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
268e0 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
268f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
26900 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
26910 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
26920 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
26930 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 23 65 6e  al = nNew;.}.#en
26940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  dif../*.** Memor
26950 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
26960 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
26970 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
26980 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
26990 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
269a0 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
269b0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
269c0 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
269d0 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
269e0 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
269f0 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
26a00 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
26a10 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
26a20 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
26a30 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
26a40 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
26a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26a60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
26a70 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
26a80 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
26a90 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
26aa0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
26ab0 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
26ac0 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
26ad0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
26ae0 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
26af0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
26b00 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
26b10 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
26b20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
26b30 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
26b40 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
26b50 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
26b60 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
26b70 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
26b80 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
26b90 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
26ba0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49  TE_FCNTL_MMAP_LI
26bb0 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69  MIT, whichever i
26bc0 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
26bd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26be0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
26bf0 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
26c00 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
26c10 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
26c20 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
26c30 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
26c40 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
26c50 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
26c60 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
26c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
26c80 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
26c90 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
26ca0 74 65 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  te){.#if SQLITE_
26cb0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
26cc0 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79    i64 nMap = nBy
26cd0 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  te;.  int rc;.. 
26ce0 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30   assert( nMap>=0
26cf0 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f   || pFd->nFetchO
26d00 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ut==0 );.  if( p
26d10 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
26d20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
26d30 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
26d40 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
26d50 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
26d60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
26d70 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
26d80 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  tion */.    rc =
26d90 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c   osFstat(pFd->h,
26da0 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
26db0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26dc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
26dd0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
26de0 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  STAT;.    }.    
26df0 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73  nMap = statbuf.s
26e00 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  t_size;.  }.  if
26e10 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
26e20 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
26e30 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
26e40 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69  izeMax;.  }..  i
26e50 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
26e60 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
26e70 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20  ( nMap>0 ){.    
26e80 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28    unixRemapfile(
26e90 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20  pFd, nMap);.    
26ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69  }else{.      uni
26eb0 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
26ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26ed0 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
26ee0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26ef0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
26f00 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
26f10 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
26f20 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
26f30 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
26f40 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
26f50 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
26f60 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
26f70 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
26f80 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
26f90 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
26fa0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
26fb0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
26fc0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
26fd0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
26fe0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
26ff0 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
27000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27010 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
27020 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
27030 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
27040 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27050 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
27060 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
27070 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
27080 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
27090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
270a0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
270b0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
270c0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
270d0 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
270e0 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
270f0 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
27100 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
27110 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
27120 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27130 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
27140 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
27150 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27160 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
27170 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
27180 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
27190 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
271a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
271b0 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
271c0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
271d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
271e0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
271f0 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
27200 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
27210 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
27220 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
27230 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
27240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27250 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27270 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
27280 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
27290 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
272a0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
272b0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
272c0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
272d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
272e0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
272f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27300 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
27310 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
27320 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
27330 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
27340 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
27350 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
27360 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e  rlier call to un
27370 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  ixFetch(). The s
27380 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
27390 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
273a0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
273b0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
273c0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
273d0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
273e0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
273f0 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69  he unixFetch() i
27400 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
27410 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
27420 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
27430 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
27440 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
27450 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
27460 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
27470 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
27480 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
27490 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
274a0 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
274b0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
274c0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
274d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
274e0 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69  unixUnfetch(sqli
274f0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27500 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
27510 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
27520 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
27530 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
27540 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
27550 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45   file */.  UNUSE
27560 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66  D_PARAMETER(iOff
27570 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  );..  /* If p==0
27580 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
27590 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
275a0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
275b0 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
275c0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
275d0 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
275e0 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
275f0 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
27600 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
27610 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
27620 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
27630 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
27640 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
27650 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
27660 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
27670 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
27680 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
27690 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
276a0 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
276b0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
276c0 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66  )[iOff] );..  if
276d0 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e  ( p ){.    pFd->
276e0 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d  nFetchOut--;.  }
276f0 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e  else{.    unixUn
27700 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
27710 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
27720 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
27730 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27740 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
27750 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
27760 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
27770 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
27780 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
27790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
277a0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
277b0 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
277c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
277d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
277e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
277f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
27830 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
27840 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
27850 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
27860 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
27870 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
27880 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
27890 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
278a0 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
278b0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
278c0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
278d0 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
278e0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
278f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
27900 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
27910 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
27920 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
27930 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
27940 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
27950 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
27960 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
27970 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
27980 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
27990 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
279a0 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
279b0 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
279c0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
279d0 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
279e0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
279f0 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
27a00 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
27a10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27a20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
27a30 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
27a40 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
27a50 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
27a60 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
27a70 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
27a80 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
27a90 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
27aa0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
27ab0 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
27ac0 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
27ad0 72 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e  r finder-funtion
27ae0 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
27af0 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
27b00 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
27b10 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
27b20 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
27b30 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
27b40 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
27b50 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
27b60 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
27b70 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
27b80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
27b90 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
27ba0 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
27bb0 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
27bc0 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
27bd0 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
27be0 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
27bf0 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
27c00 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
27c10 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
27c20 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
27c30 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
27c40 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
27c50 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
27c60 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
27c70 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
27c80 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
27c90 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
27ca0 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
27cb0 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
27cc0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27cd0 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
27ce0 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
27cf0 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
27d00 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
27d10 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
27d20 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
27d30 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
27d40 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
27d50 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
27d60 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
27d70 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
27d80 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
27d90 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
27da0 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
27db0 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
27dc0 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
27dd0 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
27de0 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
27df0 43 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69  CK)      \.stati
27e00 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
27e10 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f  io_methods METHO
27e20 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20  D = {           
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52          \.   VER
27e50 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20  SION,           
27e60 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
27e70 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  sion */         
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53         \.   CLOS
27ea0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
27eb0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
27ec0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ee0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52        \.   unixR
27ef0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
27f00 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
27f10 2a 2f 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 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72       \.   unixWr
27f40 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
27f50 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
27f60 2a 2f 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 20                  
27f80 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75      \.   unixTru
27f90 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
27fa0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
27fb0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63     \.   unixSync
27fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27ff0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20      /* xSync */ 
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 20 20 20                  
28020 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53    \.   unixFileS
28030 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
28040 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
28050 2a 2f 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 20 20 20 20                  
28070 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20   \.   LOCK,     
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20    /* xLock */   
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 20 20 20 20 20                  
280c0 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20  \.   UNLOCK,    
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280e0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20   /* xUnlock */  
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 20 20 20 20 20 5c                 \
28110 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20  .   CKLOCK,     
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
28140 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  dLock */        
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28160 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72     unixFileContr
28170 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
28180 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
28190 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
281b0 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
281c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
281d0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20   xSectorSize */ 
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 20 20 20 20 20 5c 0a 20 20              \.  
28200 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
28210 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
28220 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74  xDeviceCapabilit
28230 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ies */          
28240 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28250 75 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20  unixShmMap,     
28260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28270 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20  ShmMap */       
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
282a0 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  nixShmLock,     
282b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
282c0 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  hmLock */       
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
282f0 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  ixShmBarrier,   
28300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
28310 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20  mBarrier */     
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28340 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  xShmUnmap,      
28350 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
28360 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  Unmap */        
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28390 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
283a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
283b0 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55        \.   unixU
283e0 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nfetch,         
283f0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74         /* xUnfet
28400 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20       \.};       
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20                  
28470 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
28480 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28490 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49  thods *FINDER##I
284a0 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mpl(const char *
284b0 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b  z, unixFile *p){
284c0 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41     \.  UNUSED_PA
284d0 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53  RAMETER(z); UNUS
284e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45    \.  return &ME
28520 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20  THOD;           
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20                  
28560 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20   \.}            
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 20 20 20 20 20                  
285b0 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
285c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
285d0 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45  s *(*const FINDE
285e0 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  R)(const char*,u
285f0 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c  nixFile *p)    \
28600 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49  .    = FINDER##I
28610 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  mpl;../*.** Here
28620 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20   are all of the 
28630 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28640 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  ds objects for e
28650 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ach of the.** lo
28660 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
28670 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61  .  Functions tha
28680 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  t return pointer
28690 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f  s to these metho
286a0 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63  ds.** are also c
286b0 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54  reated..*/.IOMET
286c0 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46  HODS(.  posixIoF
286d0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
286e0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
286f0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
28700 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20  osixIoMethods,  
28710 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
28720 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28730 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
28740 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
28750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
28760 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d  red memory and m
28770 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20  map are enabled 
28780 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287a0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
287b0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287d0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
287e0 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20  /.  unixUnlock, 
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28800 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
28810 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
28820 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f  servedLock     /
28830 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28840 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
28850 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
28860 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
28870 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
28880 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
28890 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
288a0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
288b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
288c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
288d0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
28900 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
28910 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
28920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28930 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28940 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
28950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28960 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
28970 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
28980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28990 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
289a0 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
289b0 65 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78  ervedLock   /* x
289c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
289d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
289e0 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
289f0 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
28a00 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
28a10 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
28a20 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
28a30 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
28a40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28a50 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
28a60 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
28a90 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64   disabled */.  d
28aa0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
28ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
28ac0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
28ad0 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
28ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
28af0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
28b00 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
28b10 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
28b20 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
28b30 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
28b40 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65  vedLock  /* xChe
28b50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
28b60 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
28b70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
28b80 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
28b90 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54  OS_VXWORKS.IOMET
28ba0 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
28bb0 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
28bc0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
28bd0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
28be0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
28bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
28c00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28c10 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
28c20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
28c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
28c40 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
28c50 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
28c60 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
28c70 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
28c80 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
28c90 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
28ca0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
28cb0 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
28cc0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
28cd0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28ce0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
28cf0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
28d00 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
28d10 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
28d20 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
28d30 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
28d40 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
28d50 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28d60 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
28d70 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
28d80 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28da0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28db0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
28dc0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28de0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
28df0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
28e00 73 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  semClose,       
28e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28e20 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28e30 73 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  semLock,        
28e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
28e50 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
28e60 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  emUnlock,       
28e70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
28e80 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28e90 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
28ea0 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68  Lock      /* xCh
28eb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28ec0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
28ed0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
28ee0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
28ef0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
28f00 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
28f10 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
28f20 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
28f30 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
28f40 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
28f50 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
28f60 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
28f70 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28f80 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
28f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
28fb0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
28fc0 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
28fd0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
28fe0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
28ff0 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
29000 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29010 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29020 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
29030 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29040 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29050 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
29060 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29070 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29080 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29090 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
290a0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c  *.** The proxy l
290b0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73  ocking method is
290c0 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64   a "super-method
290d0 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  " in the sense t
290e0 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20  hat it.** opens 
290f0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64  secondary file d
29100 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74  escriptors for t
29110 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63  he conch and loc
29120 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69  k files and.** i
29130 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f  t uses proxy, do
29140 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64  t-file, AFP, and
29150 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
29160 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73   methods on thos
29170 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66  e.** secondary f
29180 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20  iles.  For this 
29190 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
291a0 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
291b0 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f  ents.** proxy lo
291c0 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64  cking is located
291d0 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f   much further do
291e0 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  wn in the file. 
291f0 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20   But we need.** 
29200 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
29210 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74  define the sqlit
29220 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e  e3_io_methods an
29230 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
29240 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c  n.** for proxy l
29250 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f  ocking here.  So
29260 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c   we forward decl
29270 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  are the I/O meth
29280 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ods..*/.#if defi
29290 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
292a0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
292b0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74  LOCKING_STYLE.st
292c0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c  atic int proxyCl
292d0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
292e0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  *);.static int p
292f0 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33  roxyLock(sqlite3
29300 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
29310 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
29320 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
29330 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
29340 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52   int proxyCheckR
29350 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
29360 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29  te3_file*, int*)
29370 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  ;.IOMETHODS(.  p
29380 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20  roxyIoFinder,   
29390 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
293a0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
293b0 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74   */.  proxyIoMet
293c0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
293d0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
293e0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
293f0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29420 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29430 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20  .  proxyClose,  
29440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29450 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29460 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20  .  proxyLock,   
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29480 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29490 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20    proxyUnlock,  
294a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
294b0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
294c0 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  .  proxyCheckRes
294d0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20  ervedLock    /* 
294e0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
294f0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
29500 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
29510 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
29520 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
29530 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
29540 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
29550 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
29560 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29580 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
29590 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
295a0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
295b0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
295c0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
295d0 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
295e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
295f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29600 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29610 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29630 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29640 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29650 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
29660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
29670 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
29680 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
29690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
296a0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
296b0 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
296c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
296d0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
296e0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
296f0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
29700 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29710 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
29720 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
29730 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29740 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29750 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
29760 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
29770 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
29780 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
29790 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
297a0 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
297b0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
297c0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
297d0 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
297e0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
297f0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
29800 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
29810 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
29820 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
29830 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
29840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
29850 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
29860 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
29870 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
29880 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
29890 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
298a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
298b0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
298c0 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
298d0 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
298e0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
298f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
29900 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
29910 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
29920 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29930 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
29940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29950 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
29960 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
29970 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29980 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
29990 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
299a0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
299b0 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
299c0 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
299d0 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
299e0 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
299f0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
29a00 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
29a10 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
29a20 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
29a30 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
29a40 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
29a50 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
29a60 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
29a70 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
29a80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
29a90 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
29aa0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
29ab0 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
29ac0 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
29ad0 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
29ae0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
29af0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
29b00 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
29b10 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
29b20 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
29b30 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
29b40 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
29b50 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
29b60 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
29b70 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
29b80 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
29b90 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
29ba0 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
29bb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
29bc0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
29bd0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
29be0 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
29bf0 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
29c00 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
29c10 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
29c20 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
29c30 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
29c40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
29c50 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
29c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29c70 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
29c80 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
29c90 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
29ca0 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
29cb0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
29cc0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
29cd0 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
29ce0 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
29cf0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
29d00 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
29d10 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
29d20 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
29d30 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
29d40 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
29d50 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
29d60 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
29d70 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
29d80 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
29d90 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
29da0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
29db0 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
29dc0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
29dd0 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
29de0 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
29df0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
29e00 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
29e10 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
29e20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
29e30 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
29e40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
29e50 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
29e60 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
29e70 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
29e80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29e90 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
29ea0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
29eb0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
29ec0 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
29ed0 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
29ee0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
29ef0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
29f00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
29f10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
29f20 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20  .#if OS_VXWORKS 
29f30 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29f40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
29f50 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  * .** This "find
29f60 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  er" function att
29f70 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
29f80 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ne the best lock
29f90 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a  ing strategy .**
29fa0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
29fb0 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68  e file "filePath
29fc0 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75  ".  It then retu
29fd0 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  rns the sqlite3_
29fe0 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
29ff0 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
2a000 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65  ents that strate
2a010 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  gy..**.** This i
2a020 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e  s for VXWorks on
2a030 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
2a040 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a050 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
2a060 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2a070 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2a080 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2a090 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a0a0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2a0b0 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2a0c0 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
2a0d0 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
2a0e0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
2a0f0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2a100 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2a110 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2a120 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2a130 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2a140 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2a150 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2a160 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2a170 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2a180 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2a190 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2a1a0 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
2a1b0 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
2a1c0 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
2a1d0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
2a1e0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2a1f0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2a200 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
2a210 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
2a220 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
2a230 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
2a240 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
2a250 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
2a260 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
2a270 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
2a280 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
2a290 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
2a2a0 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
2a2b0 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
2a2c0 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2a2d0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2a2e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
2a2f0 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
2a300 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
2a310 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a320 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
2a330 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
2a340 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2a350 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
2a360 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
2a370 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
2a380 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
2a390 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a3a0 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  YLE */../*.** An
2a3b0 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
2a3c0 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
2a3d0 61 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  a IO method find
2a3e0 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
2a3f0 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
2a400 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a410 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
2a420 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2a430 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
2a440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a480 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
2a4b0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
2a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a4d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
2a4e0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
2a4f0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
2a500 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
2a510 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
2a520 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
2a530 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2a540 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
2a550 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
2a560 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
2a570 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
2a580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2a590 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
2a5a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a5b0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2a5c0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
2a5d0 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5f0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
2a600 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
2a610 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  ng opened */.  s
2a620 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
2a630 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
2a640 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
2a650 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2a660 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2a670 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
2a680 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
2a690 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2a6a0 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
2a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
2a6c0 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49  o or more UNIXFI
2a6d0 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29  LE_* values */.)
2a6e0 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
2a6f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
2a700 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
2a710 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
2a720 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
2a730 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a740 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2a750 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
2a760 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73  NULL );..  /* Us
2a770 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
2a780 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
2a790 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
2a7a0 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
2a7b0 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
2a7c0 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
2a7d0 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
2a7e0 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
2a7f0 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
2a800 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
2a810 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
2a820 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
2a830 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2a840 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2a850 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2a860 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2a870 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2a880 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
2a890 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
2a8a0 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
2a8b0 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
2a8c0 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
2a8d0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
2a8e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
2a8f0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
2a900 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
2a910 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
2a920 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
2a930 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2a940 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
2a950 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
2a960 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
2a970 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
2a980 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
2a990 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
2a9a0 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
2a9b0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
2a9c0 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
2a9d0 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
2a9e0 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
2a9f0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  trlFlags;.  pNew
2aa00 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
2aa10 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2aa20 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 69 66  fig.mxMmap;.  if
2aa30 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
2aa40 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67  olean(((ctrlFlag
2aa50 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  s & UNIXFILE_URI
2aa60 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20  ) ? zFilename : 
2aa70 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2aa90 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
2aaa0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2aab0 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  E) ){.    pNew->
2aac0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2aad0 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  XFILE_PSOW;.  }.
2aae0 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66    if( strcmp(pVf
2aaf0 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65  s->zName,"unix-e
2ab00 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  xcl")==0 ){.    
2ab10 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2ab20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  |= UNIXFILE_EXCL
2ab30 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
2ab40 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49  WORKS.  pNew->pI
2ab50 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46  d = vxworksFindF
2ab60 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29  ileId(zFilename)
2ab70 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49  ;.  if( pNew->pI
2ab80 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c  d==0 ){.    ctrl
2ab90 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2aba0 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  E_NOLOCK;.    rc
2abb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2abc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2abd0 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55  f( ctrlFlags & U
2abe0 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
2abf0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2ac00 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
2ac10 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2ac20 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2ac30 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
2ac40 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
2ac50 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
2ac60 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
2ac70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2ac80 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
2ac90 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
2aca0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
2acb0 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
2acc0 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
2acd0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
2ace0 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
2acf0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
2ad00 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
2ad10 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
2ad20 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
2ad30 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
2ad40 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
2ad50 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
2ad60 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
2ad70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
2ad80 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
2ad90 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
2ada0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2adb0 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
2adc0 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
2add0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2ade0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2adf0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
2ae00 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2ae10 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
2ae20 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75  endif.  ){.    u
2ae30 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2ae40 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2ae50 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2ae60 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2ae70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ae80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
2ae90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2aea0 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  rred in findInod
2aeb0 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
2aec0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2aed0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
2aee0 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
2aef0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
2af00 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
2af10 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
2af20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
2af30 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
2af40 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
2af50 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
2af60 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
2af70 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
2af80 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
2af90 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
2afa0 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
2afb0 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
2afc0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
2afd0 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
2afe0 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
2aff0 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
2b000 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
2b010 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
2b020 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
2b030 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
2b040 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
2b050 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
2b060 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2b070 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
2b080 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
2b090 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
2b0a0 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
2b0b0 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
2b0c0 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
2b0d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
2b0e0 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
2b0f0 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
2b100 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
2b110 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
2b120 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
2b130 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
2b140 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
2b150 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
2b160 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
2b170 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
2b180 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
2b190 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
2b1a0 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
2b1b0 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
2b1c0 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
2b1d0 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
2b1e0 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
2b1f0 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
2b200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b210 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2b220 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2b230 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2b240 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2b250 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
2b260 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2b270 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2b280 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2b290 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
2b2a0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2b2b0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2b2c0 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
2b2d0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2b2e0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2b2f0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2b300 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2b310 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2b320 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
2b330 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2b340 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
2b350 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2b360 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
2b370 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
2b380 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
2b390 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2b3a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b3b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
2b3c0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a  {.      /* NB: z
2b3d0 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20  Filename exists 
2b3e0 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  and remains vali
2b3f0 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65  d until the file
2b400 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20   is closed.     
2b410 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   ** according to
2b420 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31   requirement F11
2b430 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  141.  So we do n
2b440 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
2b450 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
2b460 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e  of the filename.
2b470 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   */.      pCtx->
2b480 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  dbPath = zFilena
2b490 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  me;.      pCtx->
2b4a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
2b4b0 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29      srandomdev()
2b4c0 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65  ;.      unixEnte
2b4d0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  rMutex();.      
2b4e0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2b4f0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2b500 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  pInode);.      i
2b510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b520 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b530 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c  te3_free(pNew->l
2b540 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
2b550 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63          robust_c
2b560 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2b570 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20  LINE__);.       
2b580 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d   h = -1;.      }
2b590 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65  .      unixLeave
2b5a0 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
2b5b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2b5c0 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  f..  else if( pL
2b5d0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2b5e0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
2b5f0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69   ){.    /* Dotfi
2b600 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  le locking uses 
2b610 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2b620 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2b630 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
2b640 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
2b650 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20  ckingContext .  
2b660 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
2b670 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e  LockFile;.    in
2b680 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  t nFilename;.   
2b690 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2b6a0 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69  me!=0 );.    nFi
2b6b0 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  lename = (int)st
2b6c0 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20  rlen(zFilename) 
2b6d0 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69  + 6;.    zLockFi
2b6e0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  le = (char *)sql
2b6f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c  ite3_malloc(nFil
2b700 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2b710 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2b720 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b730 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2b740 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2b750 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
2b760 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
2b770 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
2b780 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
2b790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
2b7a0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2b7b0 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
2b7c0 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2b7d0 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
2b7e0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
2b7f0 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
2b800 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
2b810 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
2b820 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2b830 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2b840 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
2b850 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
2b860 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
2b870 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
2b880 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2b890 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2b8a0 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2b8b0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
2b8c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
2b8d0 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
2b8e0 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
2b8f0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
2b900 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
2b910 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
2b920 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2b930 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2b940 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
2b950 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
2b960 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
2b970 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2b980 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
2b990 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
2b9a0 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
2b9b0 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
2b9c0 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
2b9d0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
2b9e0 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
2b9f0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2ba00 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
2ba10 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
2ba20 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
2ba30 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
2ba40 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
2ba50 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
2ba60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ba70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
2ba80 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2ba90 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
2baa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bab0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2bac0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
2bad0 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45    .  pNew->lastE
2bae0 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53  rrno = 0;.#if OS
2baf0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
2bb00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bb10 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2bb20 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2bb30 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2bb40 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2bb50 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61  osUnlink(zFilena
2bb60 6d 65 29 3b 0a 20 20 20 20 69 73 44 65 6c 65 74  me);.    isDelet
2bb70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
2bb80 20 69 73 44 65 6c 65 74 65 20 29 20 70 4e 65 77   isDelete ) pNew
2bb90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2bba0 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
2bbb0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
2bbc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bbd0 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2bbe0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2bbf0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2bc00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
2bc10 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
2bc20 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
2bc30 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
2bc40 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28     verifyDbFile(
2bc50 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pNew);.  }.  ret
2bc60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bc70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
2bc80 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
2bc90 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
2bca0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
2bcb0 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
2bcc0 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
2bcd0 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
2bce0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
2bcf0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
2bd00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
2bd10 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
2bd20 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
2bd30 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
2bd40 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
2bd50 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
2bd60 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
2bd70 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
2bd80 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20 20  mp",.     0     
2bd90 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69     /* List termi
2bda0 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20  nator */.  };.  
2bdb0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
2bdc0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
2bdd0 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
2bde0 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a  *zDir = 0;..  az
2bdf0 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Dirs[0] = sqlite
2be00 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
2be10 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ;.  if( !azDirs[
2be20 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
2be30 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
2be40 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2be50 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
2be60 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
2be70 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
2be80 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  +]){.    if( zDi
2be90 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
2bea0 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28  .    if( osStat(
2beb0 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f  zDir, &buf) ) co
2bec0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2bed0 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
2bee0 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
2bef0 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65  ;.    if( osAcce
2bf00 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63  ss(zDir, 07) ) c
2bf10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65  ontinue;.    bre
2bf20 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2bf30 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDir;.}../*.** 
2bf40 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
2bf50 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
2bf60 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
2bf70 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
2bf80 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2bf90 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
2bfa0 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
2bfb0 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
2bfc0 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
2bfd0 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
2bfe0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
2bff0 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
2c000 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2c010 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2c020 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
2c030 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
2c040 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
2c050 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
2c060 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2c070 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
2c080 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
2c090 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
2c0a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c0b0 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Dir;..  /* It's 
2c0c0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2c0d0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2c0e0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2c0f0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2c100 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2c110 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2c120 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2c130 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2c140 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2c150 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2c160 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2c170 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2c180 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
2c190 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2c1a0 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
2c1b0 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22  ==0 ) zDir = "."
2c1c0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2c1d0 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
2c1e0 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
2c1f0 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
2c200 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
2c210 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
2c220 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
2c230 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
2c240 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44    if( (strlen(zD
2c250 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c  ir) + strlen(SQL
2c260 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
2c270 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28  EFIX) + 18) >= (
2c280 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20  size_t)nBuf ){. 
2c290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c2a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
2c2b0 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
2c2c0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c  nprintf(nBuf-18,
2c2d0 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
2c2e0 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
2c2f0 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
2c300 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  j = (int)strlen(
2c310 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
2c320 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
2c330 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
2c340 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
2c350 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
2c360 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
2c370 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
2c380 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
2c390 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
2c3a0 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
2c3b0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
2c3c0 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30     zBuf[j+1] = 0
2c3d0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
2c3e0 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
2c3f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2c400 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
2c410 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c420 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2c430 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2c440 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
2c450 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
2c460 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
2c470 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
2c480 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
2c490 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
2c4a0 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
2c4b0 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
2c4c0 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
2c4d0 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2c4e0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
2c4f0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2c500 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
2c510 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
2c520 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
2c530 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
2c540 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
2c550 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2c560 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
2c570 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
2c580 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
2c590 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
2c5a0 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
2c5b0 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
2c5c0 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
2c5d0 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
2c5e0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
2c5f0 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
2c600 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
2c610 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
2c620 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2c630 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
2c640 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2c650 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
2c660 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2c670 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
2c680 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
2c690 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
2c6a0 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
2c6b0 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
2c6c0 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
2c6d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c6e0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2c6f0 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
2c700 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
2c710 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
2c720 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
2c730 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
2c740 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
2c750 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
2c760 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
2c770 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
2c780 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2c790 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
2c7a0 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
2c7b0 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
2c7c0 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
2c7d0 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
2c7e0 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
2c7f0 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
2c800 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
2c810 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
2c820 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
2c830 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2c840 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
2c850 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
2c860 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
2c870 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2c880 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
2c890 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2c8a0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
2c8b0 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
2c8c0 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2c8d0 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
2c8e0 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
2c8f0 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
2c900 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
2c910 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
2c920 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
2c930 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
2c940 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
2c950 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
2c960 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
2c970 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
2c980 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
2c990 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
2c9a0 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
2c9b0 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
2c9c0 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
2c9d0 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
2c9e0 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
2c9f0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2ca00 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2ca10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2ca20 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
2ca30 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
2ca40 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
2ca50 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
2ca60 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
2ca70 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
2ca80 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
2ca90 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
2caa0 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
2cab0 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
2cac0 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
2cad0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
2cae0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2caf0 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
2cb00 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
2cb10 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
2cb20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
2cb30 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2cb40 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
2cb50 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
2cb60 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
2cb70 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
2cb80 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
2cb90 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
2cba0 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
2cbb0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
2cbc0 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
2cbd0 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
2cbe0 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
2cbf0 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
2cc00 72 20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69  r a resusable fi
2cc10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
2cc20 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
2cc30 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2cc40 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
2cc50 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
2cc60 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
2cc70 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2cc80 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
2cc90 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
2cca0 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
2ccb0 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
2ccc0 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
2ccd0 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
2cce0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
2ccf0 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
2cd00 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
2cd10 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
2cd20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
2cd30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
2cd40 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
2cd50 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
2cd60 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
2cd70 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
2cd80 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
2cd90 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
2cda0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
2cdb0 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
2cdc0 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
2cdd0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
2cde0 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
2cdf0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
2ce00 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2ce10 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2ce20 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
2ce30 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
2ce40 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
2ce50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2ce60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2ce70 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
2ce80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2ce90 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
2cea0 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
2ceb0 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
2cec0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2ced0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2cee0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
2cef0 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
2cf00 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
2cf10 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
2cf20 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
2cf30 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
2cf40 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
2cf50 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2cf60 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
2cf70 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
2cf80 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2cf90 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
2cfa0 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
2cfb0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
2cfc0 61 73 65 73 20 63 61 73 65 73 2c 20 74 68 69 73  ases cases, this
2cfd0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70   routine sets *p
2cfe0 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68  Mode to 0, which
2cff0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20   will become.** 
2d000 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f  an indication to
2d010 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74   robust_open() t
2d020 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  o create the fil
2d030 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  e using.** SQLIT
2d040 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2d050 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73  ERMISSIONS adjus
2d060 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
2d070 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
2d080 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2d090 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
2d0a0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2d0b0 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
2d0c0 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
2d0d0 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
2d0e0 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
2d0f0 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
2d100 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2d110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2d120 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
2d130 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
2d140 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
2d150 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
2d160 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
2d170 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
2d180 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
2d190 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
2d1a0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
2d1b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2d1c0 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
2d1d0 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f  _8_3_NAMES optio
2d1e0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2d1f0 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  en the.** origin
2d200 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75  al filename is u
2d210 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74  navailable.  But
2d220 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e   8_3_NAMES is on
2d230 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46  ly used for.** F
2d240 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61  AT filesystems a
2d250 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64  nd permissions d
2d260 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65  o not matter the
2d270 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a  re, so just use.
2d280 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ** the default p
2d290 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  ermissions..*/.s
2d2a0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
2d2b0 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20  eateFileMode(.  
2d2c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2d2d0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2d2e0 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20  /* Path of file 
2d2f0 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67  (possibly) being
2d300 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e   created */.  in
2d310 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d330 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73   Flags passed as
2d340 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   4th argument to
2d350 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f   xOpen() */.  mo
2d360 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d380 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
2d390 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77  s to open file w
2d3a0 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a  ith */.  uid_t *
2d3b0 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  pUid,           
2d3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d3d0 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   uid to set on t
2d3e0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64  he file */.  gid
2d3f0 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20  _t *pGid        
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d410 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20  OUT: gid to set 
2d420 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29  on the file */.)
2d430 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2d440 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2d450 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2d460 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d  de */.  *pMode =
2d470 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b   0;.  *pUid = 0;
2d480 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20  .  *pGid = 0;.  
2d490 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
2d4a0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
2d4b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2d4c0 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
2d4d0 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
2d4e0 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
2d4f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
2d500 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
2d510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d520 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d530 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
2d540 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74  in zDb */.    st
2d550 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2d560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d570 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
2d580 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
2d590 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
2d5a0 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
2d5b0 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
2d5c0 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
2d5d0 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
2d5e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
2d5f0 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
2d600 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2d610 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
2d620 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
2d630 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
2d640 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
2d650 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
2d660 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2d670 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
2d680 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2d690 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
2d6a0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2d6b0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
2d6c0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2d6d0 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
2d6e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
2d6f0 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c   NN is a decimal
2d700 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
2d710 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
2d720 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
2d730 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
2d740 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
2d750 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
2d760 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2d770 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69  (zPath) - 1; .#i
2d780 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2d790 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20  LE_8_3_NAMES.   
2d7a0 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26   while( nDb>0 &&
2d7b0 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28   sqlite3Isalnum(
2d7c0 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44  zPath[nDb]) ) nD
2d7d0 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62  b--;.    if( nDb
2d7e0 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62  ==0 || zPath[nDb
2d7f0 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]!='-' ) return 
2d800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
2d810 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
2d820 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20  h[nDb]!='-' ){. 
2d830 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62       assert( nDb
2d840 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
2d850 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d  rt( zPath[nDb]!=
2d860 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44  '\n' );.      nD
2d870 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  b--;.    }.#endi
2d880 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  f.    memcpy(zDb
2d890 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20  , zPath, nDb);. 
2d8a0 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c     zDb[nDb] = '\
2d8b0 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d  0';..    if( 0==
2d8c0 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74  osStat(zDb, &sSt
2d8d0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d  at) ){.      *pM
2d8e0 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
2d8f0 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
2d900 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e    *pUid = sStat.
2d910 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70  st_uid;.      *p
2d920 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67  Gid = sStat.st_g
2d930 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  id;.    }else{. 
2d940 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d950 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
2d960 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2d970 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2d980 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2d990 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20  E ){.    *pMode 
2d9a0 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65  = 0600;.  }.  re
2d9b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d9c0 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
2d9d0 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
2d9e0 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
2d9f0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
2da00 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
2da10 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
2da20 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
2da30 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2da40 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
2da50 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
2da60 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
2da70 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
2da80 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
2da90 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
2daa0 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
2dab0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2dac0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
2dad0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
2dae0 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
2daf0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
2db00 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
2db10 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
2db20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
2db30 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
2db40 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
2db50 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
2db60 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
2db70 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
2db80 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
2db90 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
2dba0 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
2dbb0 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
2dbc0 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
2dbd0 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
2dbe0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
2dbf0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
2dc00 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
2dc10 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
2dc20 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
2dc30 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
2dc40 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
2dc50 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
2dc60 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
2dc70 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
2dc80 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
2dc90 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
2dca0 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
2dcb0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2dcc0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2dcd0 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
2dce0 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
2dcf0 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
2dd00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2dd10 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
2dd20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
2dd30 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
2dd40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2dd50 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
2dd60 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
2dd70 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
2dd80 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
2dd90 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2dda0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
2ddb0 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
2ddc0 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
2ddd0 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
2dde0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
2ddf0 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
2de00 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
2de10 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
2de20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
2de30 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
2de40 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
2de70 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
2de80 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
2de90 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b  t openFlags = 0;
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2deb0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
2dec0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
2ded0 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
2dee0 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
2def0 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
2df00 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
2df10 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2df20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2df30 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
2df40 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20  primitives */.  
2df50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2df60 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
2df70 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
2df80 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
2df90 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20  ctrlFlags = 0;  
2dfa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e             /* UN
2dfb0 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a  IXFILE_* flags *
2dfc0 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
2dfd0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
2dfe0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2dff0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
2e000 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
2e010 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2e020 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2e030 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
2e040 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
2e050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2e060 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
2e070 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
2e080 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e090 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
2e0a0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
2e0b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e0c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
2e0d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2e0e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2e0f0 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
2e100 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
2e110 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
2e120 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ROXY);.#endif.#i
2e130 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2e140 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
2e150 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2e160 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
2e170 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64  tfs fsInfo;.#end
2e180 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  if..  /* If crea
2e190 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
2e1a0 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
2e1b0 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
2e1c0 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
2e1d0 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
2e1e0 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
2e1f0 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
2e200 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
2e210 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
2e220 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
2e230 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e240 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
2e250 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
2e260 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44    */.  int syncD
2e270 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  ir = (isCreate &
2e280 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
2e290 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2e2a0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
2e2b0 20 20 20 20 7c 7c 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 49 4e 5f 4a  LITE_OPEN_MAIN_J
2e2d0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
2e2e0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2e2f0 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20  EN_WAL.  ));..  
2e300 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
2e310 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
2e320 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
2e330 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
2e340 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
2e350 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
2e360 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
2e370 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
2e380 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
2e390 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
2e3a0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
2e3b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2e3c0 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a  zName = zPath;..
2e3d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
2e3e0 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
2e3f0 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
2e400 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
2e410 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
2e420 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
2e430 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
2e440 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
2e450 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
2e460 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
2e470 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
2e480 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
2e490 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
2e4a0 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
2e4b0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
2e4c0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
2e4d0 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
2e4e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
2e4f0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
2e500 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2e510 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
2e520 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
2e530 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
2e540 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
2e550 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
2e560 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
2e570 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
2e580 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
2e590 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
2e5a0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
2e5b0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
2e5c0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
2e5d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
2e5e0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
2e5f0 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
2e600 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2e610 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
2e620 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
2e630 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
2e640 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
2e650 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
2e660 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2e670 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2e680 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2e690 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
2e6a0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2e6b0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2e6c0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2e6d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2e6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2e6f0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2e700 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2e710 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
2e720 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
2e730 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2e740 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2e750 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
2e760 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
2e770 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
2e780 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
2e790 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
2e7a0 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
2e7b0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
2e7c0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e7d0 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
2e7e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2e7f0 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
2e800 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2e810 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2e820 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
2e830 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
2e840 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
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 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2e870 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2e880 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
2e890 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
2e8a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2e8b0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
2e8c0 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
2e8d0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
2e8e0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2e8f0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2e900 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2e910 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e920 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2e930 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2e940 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2e950 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2e960 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2e970 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2e980 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2e990 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2e9a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2e9b0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2e9c0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e  lloc(sizeof(*pUn
2e9d0 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
2e9e0 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
2e9f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ea00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2ea10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2ea20 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65  pUnused = pUnuse
2ea30 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62  d;..    /* Datab
2ea40 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ase filenames ar
2ea50 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  e double-zero te
2ea60 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79  rminated if they
2ea70 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   are not.    ** 
2ea80 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
2ea90 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
2eaa0 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
2eab0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20   passed into.   
2eac0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
2ead0 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a  parameter(). */.
2eae0 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
2eaf0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2eb00 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73  _URI) || zName[s
2eb10 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2eb20 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  =0 );..  }else i
2eb30 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  f( !zName ){.   
2eb40 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2eb50 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20  NULL, the upper 
2eb60 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74  layer is request
2eb70 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e  ing a temp file.
2eb80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69   */.    assert(i
2eb90 73 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63  sDelete && !sync
2eba0 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75  Dir);.    rc = u
2ebb0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d  nixGetTempname(M
2ebc0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a  AX_PATHNAME+2, z
2ebd0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
2ebe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ebf0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ec00 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  rc;.    }.    zN
2ec10 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
2ec20 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2ec30 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2ec40 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73  names are always
2ec50 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2ec60 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66  minated.    ** f
2ec70 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65  or use by sqlite
2ec80 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
2ec90 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ). */.    assert
2eca0 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a  ( zName[strlen(z
2ecb0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20  Name)+1]==0 );. 
2ecc0 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
2ecd0 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ne the value of 
2ece0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2ecf0 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f  ter passed to PO
2ed00 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  SIX function.  *
2ed10 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20  * open(). These 
2ed20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74  must be calculat
2ed30 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28  ed even if open(
2ed40 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c  ) is not called,
2ed50 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61   as.  ** they ma
2ed60 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70  y be stored as p
2ed70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
2ed80 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20  handle and used 
2ed90 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f  by the .  ** 'co
2eda0 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e  nch file' lockin
2edb0 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65  g functions late
2edc0 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  r on.  */.  if( 
2edd0 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70  isReadonly )  op
2ede0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
2edf0 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61  NLY;.  if( isRea
2ee00 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61  dWrite ) openFla
2ee10 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20  gs |= O_RDWR;.  
2ee20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20  if( isCreate )  
2ee30 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2ee40 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73  _CREAT;.  if( is
2ee50 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e  Exclusive ) open
2ee60 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c  Flags |= (O_EXCL
2ee70 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20  |O_NOFOLLOW);.  
2ee80 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2ee90 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
2eea0 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30  RY);..  if( fd<0
2eeb0 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f   ){.    mode_t o
2eec0 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  penMode;        
2eed0 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73        /* Permiss
2eee0 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66  ions to create f
2eef0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20  ile with */.    
2ef00 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20  uid_t uid;      
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ef20 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20   Userid for the 
2ef30 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f  file */.    gid_
2ef40 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
2ef50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
2ef60 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
2ef70 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69  e */.    rc = fi
2ef80 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2ef90 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26  (zName, flags, &
2efa0 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
2efb0 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  &gid);.    if( r
2efc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2efd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2efe0 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20  ->pUnused );.   
2eff0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2f000 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
2f010 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
2f020 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f030 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65  RNAL );.      re
2f040 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2f050 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
2f060 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
2f070 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
2f080 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
2f090 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30  PENX   %-3d %s 0
2f0a0 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65  %o\n", fd, zName
2f0b0 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20  , openFlags));. 
2f0c0 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2f0d0 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20  rrno!=EISDIR && 
2f0e0 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
2f0f0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
2f100 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
2f110 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
2f120 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2f130 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
2f140 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66  only. */.      f
2f150 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
2f160 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2f170 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2f180 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46  TE);.      openF
2f190 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52  lags &= ~(O_RDWR
2f1a0 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20  |O_CREAT);.     
2f1b0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
2f1c0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2f1d0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
2f1e0 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20  |= O_RDONLY;.   
2f1f0 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20     isReadonly = 
2f200 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f  1;.      fd = ro
2f210 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
2f220 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
2f230 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Mode);.    }.   
2f240 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2f250 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
2f260 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2f270 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
2f280 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2f290 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
2f2a0 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
2f2b0 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65  /* If this proce
2f2c0 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  ss is running as
2f2d0 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65   root and if cre
2f2e0 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c  ating a new roll
2f2f0 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
2f300 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c  nal or WAL file,
2f310 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68   set the ownersh
2f320 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ip of the journa
2f330 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20  l or WAL to be. 
2f340 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
2f350 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
2f360 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
2f370 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
2f380 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
2f390 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2f3a0 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
2f3b0 20 20 20 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c      osFchown(fd,
2f3c0 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20   uid, gid);.    
2f3d0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2f3e0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
2f3f0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
2f400 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
2f410 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
2f420 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
2f430 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
2f440 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
2f450 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
2f460 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
2f470 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
2f480 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
2f490 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
2f4a0 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
2f4b0 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
2f4c0 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
2f4d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2f4e0 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
2f4f0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
2f500 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
2f510 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
2f520 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f530 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
2f540 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2f550 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2f560 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2f570 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
2f580 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
2f590 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28  ) == -1 ){.    (
2f5a0 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2f5b0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
2f5c0 72 72 6e 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74  rrno;.    robust
2f5d0 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
2f5e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74  LINE__);.    ret
2f5f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2f600 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
2f610 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
2f620 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
2f630 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
2f640 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
2f650 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
2f660 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
2f670 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
2f680 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2f690 20 53 65 74 20 75 70 20 61 70 70 72 6f 70 72 69   Set up appropri
2f6a0 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f  ate ctrlFlags */
2f6b0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
2f6c0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2f6d0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2f6e0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
2f6f0 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
2f700 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  )              c
2f710 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2f720 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  FILE_RDONLY;.  i
2f730 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20  f( noLock )     
2f740 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2f750 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2f760 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28  LE_NOLOCK;.  if(
2f770 20 73 79 6e 63 44 69 72 20 29 20 20 20 20 20 20   syncDir )      
2f780 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2f790 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2f7a0 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20  _DIRSYNC;.  if( 
2f7b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2f7c0 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c  PEN_URI ) ctrlFl
2f7d0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2f7e0 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  URI;..#if SQLITE
2f7f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f800 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45  STYLE.#if SQLITE
2f810 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
2f820 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72  CKING.  isAutoPr
2f830 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  oxy = 1;.#endif.
2f840 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78    if( isAutoProx
2f850 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c  y && (zPath!=NUL
2f860 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20  L) && (!noLock) 
2f870 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29  && pVfs->xOpen )
2f880 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66  {.    char *envf
2f890 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53  orce = getenv("S
2f8a0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2f8b0 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20  Y_LOCKING");.   
2f8c0 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20   int useProxy = 
2f8d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  0;..    /* SQLIT
2f8e0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2f8f0 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66  CKING==1 means f
2f900 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20  orce always use 
2f910 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a  proxy, 0 means .
2f920 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65      ** never use
2f930 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61   proxy, NULL mea
2f940 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72  ns use proxy for
2f950 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73   non-local files
2f960 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
2f970 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c  f( envforce!=NUL
2f980 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72  L ){.      usePr
2f990 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f  oxy = atoi(envfo
2f9a0 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73  rce)>0;.    }els
2f9b0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 61  e{.      if( sta
2f9c0 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49 6e  tfs(zPath, &fsIn
2f9d0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2f9e0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
2f9f0 79 2c 20 74 68 65 20 63 6c 6f 73 65 28 66 64 29  y, the close(fd)
2fa00 20 63 61 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74   call is sub-opt
2fa10 69 6d 61 6c 2e 20 49 66 20 74 68 65 20 66 69 6c  imal. If the fil
2fa20 65 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 20  e opened.       
2fa30 20 2a 2a 20 77 69 74 68 20 66 64 20 69 73 20 61   ** with fd is a
2fa40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2fa50 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6f 74  and there are ot
2fa60 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
2fa70 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
2fa80 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
2fa90 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
2faa0 68 6f 6c 64 69 6e 67 20 61 64 76 69 73 6f 72 79  holding advisory
2fab0 20 6c 6f 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20   locks on it,.  
2fac0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2fad0 65 20 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28  e call to close(
2fae0 29 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68  ) will cancel th
2faf0 6f 73 65 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72  ose locks. In pr
2fb00 61 63 74 69 63 65 2c 0a 20 20 20 20 20 20 20 20  actice,.        
2fb10 2a 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e  ** we're assumin
2fb20 67 20 74 68 61 74 20 73 74 61 74 66 73 28 29 20  g that statfs() 
2fb30 64 6f 65 73 6e 27 74 20 66 61 69 6c 20 76 65 72  doesn't fail ver
2fb40 79 20 6f 66 74 65 6e 2e 20 41 74 20 6c 65 61 73  y often. At leas
2fb50 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  t.        ** not
2fb60 20 77 68 69 6c 65 20 6f 74 68 65 72 20 66 69 6c   while other fil
2fb70 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
2fb80 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ened by the same
2fb90 20 70 72 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20   process on.    
2fba0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
2fbb0 66 69 6c 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  file are working
2fbc0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d  .  */.        p-
2fbd0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
2fbe0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  no;.        robu
2fbf0 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
2fc00 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
2fc10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2fc20 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
2fc30 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2fc40 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 7d  inished;.      }
2fc50 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
2fc60 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61  = !(fsInfo.f_fla
2fc70 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20  gs&MNT_LOCAL);. 
2fc80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
2fc90 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72  Proxy ){.      r
2fca0 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2fcb0 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
2fcc0 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
2fcd0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
2fce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fcf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2fd00 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
2fd10 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a  xFile((unixFile*
2fd20 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22  )pFile, ":auto:"
2fd30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fd40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2fd60 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c   unixClose to cl
2fd70 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75  ean up the resou
2fd80 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66 69  rces added in fi
2fd90 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20  llInUnixFile .  
2fda0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63          ** and c
2fdb0 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72  lear all the str
2fdc0 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65 6e  ucture's referen
2fdd0 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ces.  Specifical
2fde0 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ly, .          *
2fdf0 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  * pFile->pMethod
2fe00 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73  s will be NULL s
2fe10 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  o sqlite3OsClose
2fe20 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70   will be a no-op
2fe30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20   .          */. 
2fe40 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f           unixClo
2fe50 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  se(pFile);.     
2fe60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2fe70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe80 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  }.      goto ope
2fe90 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
2fea0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  }.  }.#endif.  .
2feb0 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
2fec0 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20  xFile(pVfs, fd, 
2fed0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74  pFile, zPath, ct
2fee0 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f  rlFlags);..open_
2fef0 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20  finished:.  if( 
2ff00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ff10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2ff20 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  e(p->pUnused);. 
2ff30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ff40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
2ff50 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
2ff60 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
2ff70 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
2ff80 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
2ff90 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
2ffa0 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
2ffb0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
2ffc0 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
2ffd0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2ffe0 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  NotUsed,     /* 
2fff0 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
30000 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65  his as the xDele
30010 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  te method */.  c
30020 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
30030 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
30040 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64   of file to be d
30050 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
30060 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20  dirSync         
30070 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
30080 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74  , fsync() direct
30090 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
300a0 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ng file */.){.  
300b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
300c0 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
300d0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
300e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
300f0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
30100 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
30110 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a    if( osUnlink(z
30120 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  Path)==(-1) ){. 
30130 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e     if( errno==EN
30140 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 63  OENT ){.      rc
30150 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
30160 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20  DELETE_NOENT;.  
30170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
30180 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
30190 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
301a0 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20  LETE, "unlink", 
301b0 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
301c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
301d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
301e0 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
301f0 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 26    if( (dirSync &
30200 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e   1)!=0 ){.    in
30210 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
30220 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a  sOpenDirectory(z
30230 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
30240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30250 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  K ){.#if OS_VXWO
30260 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73  RKS.      if( fs
30270 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65  ync(fd)==-1 ).#e
30280 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73  lse.      if( fs
30290 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66  ync(fd) ).#endif
302a0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
302b0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
302c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
302d0 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
302e0 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
302f0 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
30300 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
30310 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
30320 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
30330 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
30340 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30350 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OK;.    }.  }.#e
30360 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
30370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
30380 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
30390 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69   or access permi
303a0 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a  ssions of file z
303b0 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73  Path. The.** tes
303c0 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65  t performed depe
303d0 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
303e0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
303f0 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
30400 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72  SS_EXISTS: Retur
30410 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
30420 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51  exists.**     SQ
30430 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
30440 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20  WRITE: Return 1 
30450 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
30460 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ead and writable
30470 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  ..**     SQLITE_
30480 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a  ACCESS_READONLY:
30490 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
304a0 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c   file is readabl
304b0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
304c0 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  se return 0..*/.
304d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41  static int unixA
304e0 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
304f0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
30500 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74   /* The VFS cont
30510 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63  aining this xAcc
30520 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ess method */.  
30530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
30540 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20  h,      /* Path 
30550 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65  of the file to e
30560 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  xamine */.  int 
30570 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
30580 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77      /* What do w
30590 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20  e want to learn 
305a0 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20  about the zPath 
305b0 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a  file? */.  int *
305c0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
305d0 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
305e0 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20  lt boolean here 
305f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64  */.){.  int amod
30600 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  e = 0;.  UNUSED_
30610 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30620 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
30630 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
30640 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
30650 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  S; );.  switch( 
30660 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
30670 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
30680 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d  EXISTS:.      am
30690 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20  ode = F_OK;.    
306a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
306b0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
306c0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
306d0 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f   amode = W_OK|R_
306e0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
306f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
30700 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
30710 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b      amode = R_OK
30720 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
30730 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
30740 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
30750 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
30760 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
30770 73 4f 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73  sOut = (osAccess
30780 28 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d  (zPath, amode)==
30790 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d  0);.  if( flags=
307a0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
307b0 58 49 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75  XISTS && *pResOu
307c0 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
307d0 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
307e0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74  ( 0==osStat(zPat
307f0 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66 2e  h, &buf) && buf.
30800 73 74 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  st_size==0 ){.  
30810 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30      *pResOut = 0
30820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
30830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30840 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
30850 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
30860 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
30870 61 74 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c  athname. The rel
30880 61 74 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73  ative path.** is
30890 20 73 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c   stored as a nul
308a0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
308b0 6e 67 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ng in the buffer
308c0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
308d0 2a 20 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20  * zPath. .**.** 
308e0 7a 4f 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  zOut points to a
308f0 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
30900 61 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  ast sqlite3_vfs.
30910 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73  mxPathname bytes
30920 20 0a 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61   .** (in this ca
30930 73 65 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45  se, MAX_PATHNAME
30940 20 62 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c   bytes). The ful
30950 6c 2d 70 61 74 68 20 69 73 20 77 72 69 74 74 65  l-path is writte
30960 6e 20 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66  n to.** this buf
30970 66 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  fer before retur
30980 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
30990 69 6e 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68  int unixFullPath
309a0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
309b0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
309c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
309d0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
309e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
309f0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
30a00 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
30a10 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
30a20 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  h */.  int nOut,
30a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a40 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
30a50 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
30a60 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
30a70 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
30a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
30a90 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
30aa0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
30ab0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
30ac0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
30ad0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
30ae0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
30af0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
30b00 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
30b10 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
30b20 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
30b30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
30b40 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
30b50 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
30b60 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
30b70 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
30b80 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
30b90 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
30ba0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
30bb0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
30bc0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
30bd0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
30be0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d  Vfs->mxPathname=
30bf0 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b  =MAX_PATHNAME );
30c00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30c10 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f  TER(pVfs);..  zO
30c20 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
30c30 27 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  ';.  if( zPath[0
30c40 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71  ]=='/' ){.    sq
30c50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
30c60 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
30c70 20 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65   zPath);.  }else
30c80 7b 0a 20 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a  {.    int nCwd;.
30c90 20 20 20 20 69 66 28 20 6f 73 47 65 74 63 77 64      if( osGetcwd
30ca0 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d  (zOut, nOut-1)==
30cb0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
30cc0 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
30cd0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
30ce0 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c 20 7a  KPT, "getcwd", z
30cf0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
30d00 20 6e 43 77 64 20 3d 20 28 69 6e 74 29 73 74 72   nCwd = (int)str
30d10 6c 65 6e 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73  len(zOut);.    s
30d20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
30d30 6e 4f 75 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74  nOut-nCwd, &zOut
30d40 5b 6e 43 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a  [nCwd], "/%s", z
30d50 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
30d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30d70 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
30d80 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
30d90 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
30da0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
30db0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
30dc0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
30dd0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
30de0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
30df0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
30e00 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
30e10 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
30e20 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
30e30 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
30e40 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
30e50 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
30e60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
30e70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
30e80 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
30e90 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
30ea0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
30eb0 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
30ec0 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
30ed0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
30ee0 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
30ef0 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
30f00 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
30f10 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
30f20 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
30f30 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
30f40 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
30f50 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
30f60 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
30f70 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
30f80 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
30f90 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
30fa0 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
30fb0 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
30fc0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
30fd0 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
30fe0 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
30ff0 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
31000 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
31010 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
31020 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
31030 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
31040 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
31050 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
31060 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31070 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
31080 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
31090 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
310a0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
310b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
310c0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
310d0 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
310e0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
310f0 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
31100 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
31110 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31120 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
31130 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
31140 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
31150 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
31160 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
31170 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
31180 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
31190 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
311a0 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
311b0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
311c0 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
311d0 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
311e0 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
311f0 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
31200 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
31210 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
31220 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
31230 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
31240 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
31250 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
31260 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
31270 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
31280 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
31290 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
312a0 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
312b0 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
312c0 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
312d0 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
312e0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
312f0 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
31300 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
31310 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
31320 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
31330 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
31340 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
31350 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
31360 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
31370 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
31380 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
31390 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
313a0 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
313b0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
313c0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
313d0 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
313e0 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
313f0 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
31400 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
31410 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
31420 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
31430 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
31440 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
31450 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
31460 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
31470 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
31480 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
31490 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
314a0 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
314b0 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
314c0 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
314d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
314e0 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
314f0 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
31500 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
31510 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
31520 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
31530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
31540 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
31550 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
31560 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
31570 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31580 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
31590 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
315a0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
315b0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
315c0 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
315d0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
315e0 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
315f0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
31600 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
31610 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
31620 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
31630 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
31640 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
31650 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
31660 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
31670 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
31680 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
31690 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
316a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
316b0 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
316c0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
316d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
316e0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
316f0 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
31700 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
31710 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
31720 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
31730 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
31740 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
31750 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
31760 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
31770 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
31780 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
31790 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
317a0 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
317b0 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
317c0 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
317d0 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
317e0 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
317f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
31800 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
31810 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
31820 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
31830 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
31840 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
31850 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
31860 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
31870 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
31880 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
31890 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
318a0 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
318b0 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
318c0 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
318d0 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
318e0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
318f0 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
31900 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
31910 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
31920 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
31930 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
31940 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
31950 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
31960 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
31970 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
31980 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
31990 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
319a0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
319b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
319c0 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
319d0 74 20 70 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a  t pid, fd, got;.
319e0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
319f0 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
31a00 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
31a10 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
31a20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
31a30 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
31a40 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
31a50 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
31a60 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20  (t));.      pid 
31a70 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
31a80 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
31a90 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c  izeof(t)], &pid,
31aa0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
31ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
31ac0 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70 69  eof(t)+sizeof(pi
31ad0 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66  d)<=(size_t)nBuf
31ae0 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d   );.      nBuf =
31af0 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a   sizeof(t) + siz
31b00 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d 65  eof(pid);.    }e
31b10 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67  lse{.      do{ g
31b20 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  ot = osRead(fd, 
31b30 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
31b40 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
31b50 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
31b60 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
31b70 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
31b80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
31b90 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
31ba0 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
31bb0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
31bc0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
31bd0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
31be0 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
31bf0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
31c00 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
31c10 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
31c20 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
31c30 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
31c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
31c50 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
31c60 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
31c70 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
31c80 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
31c90 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
31ca0 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
31cb0 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
31cc0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
31cd0 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
31ce0 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
31cf0 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
31d00 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
31d10 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
31d20 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31d30 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
31d40 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
31d50 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
31d60 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
31d70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
31d80 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
31d90 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
31da0 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
31db0 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
31dc0 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
31dd0 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
31de0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
31df0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
31e00 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
31e10 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
31e20 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
31e30 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
31e40 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
31e50 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31e60 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
31e70 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
31e80 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
31e90 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
31ea0 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
31eb0 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
31ec0 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
31ed0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31ee0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
31ef0 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
31f00 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
31f10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
31f20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
31f30 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
31f40 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
31f50 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
31f60 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
31f70 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
31f80 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
31f90 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
31fa0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
31fb0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
31fc0 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
31fd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
31fe0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
31ff0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
32000 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
32010 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
32020 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
32030 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
32040 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
32050 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
32060 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
32070 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
32080 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
32090 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
320a0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
320b0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
320c0 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
320d0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
320e0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
320f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
32100 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
32110 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
32120 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
32130 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
32140 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
32150 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
32160 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
32170 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
32180 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
32190 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
321a0 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
321b0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
321c0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
321d0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
321e0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
321f0 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
32200 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
32210 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
32220 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
32230 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
32240 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
32250 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
32260 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
32270 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
32280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32290 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  E_OK;.#if define
322a0 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
322b0 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
322c0 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
322d0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
322e0 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  t)*1000 + unixEp
322f0 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
32300 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
32310 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
32320 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
32330 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
32340 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
32350 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
32360 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
32370 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
32380 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
32390 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
323a0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
323b0 3b 0a 20 20 69 66 28 20 67 65 74 74 69 6d 65 6f  ;.  if( gettimeo
323c0 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d  fday(&sNow, 0)==
323d0 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  0 ){.    *piNow 
323e0 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
323f0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
32400 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
32410 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
32420 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
32430 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
32440 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  R;.  }.#endif..#
32450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
32460 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
32470 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
32480 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
32490 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
324a0 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
324b0 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
324c0 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
324d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
324e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
324f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32500 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
32510 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
32520 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
32530 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
32540 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
32550 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
32560 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
32570 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
32580 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
32590 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
325a0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
325b0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
325c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
325d0 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  ixCurrentTime(sq
325e0 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
325f0 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ed, double *prNo
32600 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  w){.  sqlite3_in
32610 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  t64 i = 0;.  int
32620 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41   rc;.  UNUSED_PA
32630 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32640 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72  ;.  rc = unixCur
32650 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c  rentTimeInt64(0,
32660 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d   &i);.  *prNow =
32670 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
32680 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32690 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64 20 74 68  *.** We added th
326a0 65 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  e xGetLastError(
326b0 29 20 6d 65 74 68 6f 64 20 77 69 74 68 20 74 68  ) method with th
326c0 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70  e intention of p
326d0 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74  roviding.** bett
326e0 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  er low-level err
326f0 6f 72 20 6d 65 73 73 61 67 65 73 20 77 68 65 6e  or messages when
32700 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65   operating-syste
32710 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20  m problems come 
32720 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  up.** during SQL
32730 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
32740 42 75 74 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65  But so far, none
32750 20 6f 66 20 74 68 61 74 20 68 61 73 20 62 65 65   of that has bee
32760 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  n implemented.**
32770 20 69 6e 20 74 68 65 20 63 6f 72 65 2e 20 20 53   in the core.  S
32780 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
32790 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
327a0 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20 69 73 20   For now, it is 
327b0 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63  merely.** a plac
327c0 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61  e-holder..*/.sta
327d0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c  tic int unixGetL
327e0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
327f0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
32800 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61  nt NotUsed2, cha
32810 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20  r *NotUsed3){.  
32820 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32830 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55  (NotUsed);.  UNU
32840 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32850 74 55 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45  tUsed2);.  UNUSE
32860 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
32870 73 65 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed3);.  return 
32880 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  0;.}.../*.******
32890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
328a0 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
328b0 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
328c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
328d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
328e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
328f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32900 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
329a0 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
329b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
329c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
329d0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
329e0 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
329f0 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
32a00 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
32a10 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
32a20 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
32a30 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
32a40 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
32a50 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
32a60 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
32a70 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
32a80 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
32a90 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
32aa0 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
32ab0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
32ac0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
32ad0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
32ae0 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
32af0 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
32b00 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
32b10 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
32b20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
32b30 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
32b40 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
32b50 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
32b60 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
32b70 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
32b80 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
32b90 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
32ba0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
32bb0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
32bc0 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
32bd0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
32be0 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
32bf0 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
32c00 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
32c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
32c20 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
32c30 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
32c40 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
32c50 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
32c60 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
32c70 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
32c80 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
32c90 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
32ca0 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
32cb0 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
32cc0 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
32cd0 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
32ce0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
32cf0 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
32d00 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
32d10 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
32d20 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
32d30 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
32d40 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
32d50 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
32d60 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
32d70 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
32d80 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
32d90 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
32da0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
32db0 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
32dc0 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
32dd0 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
32de0 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
32df0 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
32e00 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
32e10 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
32e20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
32e30 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
32e40 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
32e50 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
32e60 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
32e70 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
32e80 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
32e90 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
32ea0 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
32eb0 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45  00000.**      RE
32ec0 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20  SERVED_BYTE     
32ed0 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20    0x40000001.** 
32ee0 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47       SHARED_RANG
32ef0 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
32f00 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30  002 -> 0x4000020
32f10 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  0.**.** This wor
32f20 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c  ks well on the l
32f30 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  ocal file system
32f40 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65  , but shows a ne
32f50 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f  arly 100x.** slo
32f60 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65  wdown in read pe
32f70 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50  rformance on AFP
32f80 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50   because the AFP
32f90 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73   client disables
32fa0 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63  .** the read cac
32fb0 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e  he when byte-ran
32fc0 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65  ge locks are pre
32fd0 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20  sent.  Enabling 
32fe0 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68  the read.** cach
32ff0 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68  e exposes a cach
33000 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62  e coherency prob
33010 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73  lem that is pres
33020 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a  ent on all OS X.
33030 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74  ** supported net
33040 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d  work file system
33050 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20  s.  NFS and AFP 
33060 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65  both observe the
33070 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65  .** close-to-ope
33080 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20  n semantics for 
33090 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63  ensuring cache c
330a0 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74  oherency.** [htt
330b0 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f  p://nfs.sourcefo
330c0 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d  rge.net/#faq_a8]
330d0 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  , which does not
330e0 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20   effectively.** 
330f0 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75  address the requ
33100 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e  irements for con
33110 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
33120 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
33130 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61  ple.** readers a
33140 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68  nd writers.** [h
33150 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65  ttp://www.nabble
33160 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e  .com/SQLite-on-N
33170 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e  FS-cache-coheren
33180 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74  cy-td15655701.ht
33190 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64  ml]..**.** To ad
331a0 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72  dress the perfor
331b0 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20  mance and cache 
331c0 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73  coherency issues
331d0 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63  , proxy file loc
331e0 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
331f0 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65  the way database
33200 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72   access is contr
33210 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e  olled by limitin
33220 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a  g access to a.**
33230 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20   single host at 
33240 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e  a time and movin
33250 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66  g file locks off
33260 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33270 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74   file.** and ont
33280 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f  o a proxy file o
33290 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65  n the local file
332a0 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a   system.  .**.**
332b0 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20  .** Using proxy 
332c0 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  locks.** -------
332d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
332e0 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73   C APIs.**.**  s
332f0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
33300 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20  rol(db, dbname, 
33310 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
33320 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33340 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20     <proxy_path> 
33350 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20  | ":auto:");.** 
33360 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
33370 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
33380 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
33390 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72  KPROXYFILE, &<pr
333a0 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
333b0 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
333c0 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
333d0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
333e0 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
333f0 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
33400 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
33410 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
33420 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
33430 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
33440 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
33450 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
33460 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
33470 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
33480 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
33490 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
334a0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
334b0 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
334c0 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
334d0 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
334e0 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
334f0 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
33500 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
33510 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
33520 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
33530 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
33540 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
33550 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
33560 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
33570 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
33580 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
33590 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
335a0 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
335b0 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
335c0 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
335d0 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
335e0 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
335f0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
33600 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
33610 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
33620 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
33630 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
33640 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
33650 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
33660 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
33670 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
33680 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
33690 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
336a0 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
336b0 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
336c0 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
336d0 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
336e0 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
336f0 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
33700 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
33710 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
33720 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
33730 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
33740 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
33750 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
33760 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
33770 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
33780 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
33790 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
337a0 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
337b0 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
337c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
337d0 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
337e0 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
337f0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
33800 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
33810 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
33820 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
33830 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
33840 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
33850 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
33860 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
33870 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
33880 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
33890 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
338a0 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
338b0 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
338c0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
338d0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
338e0 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
338f0 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
33900 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
33910 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
33920 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
33930 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
33940 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
33950 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
33960 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
33970 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
33980 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
33990 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
339a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
339b0 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
339c0 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
339d0 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
339e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
339f0 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
33a00 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
33a10 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
33a20 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
33a30 73 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74  st, or it's cont
33a40 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
33a50 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
33a60 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
33a70 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
33a80 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
33a90 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
33aa0 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
33ab0 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
33ac0 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
33ad0 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
33ae0 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
33af0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
33b00 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
33b10 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
33b20 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
33b30 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
33b40 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
33b50 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
33b60 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
33b70 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
33b80 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
33b90 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
33ba0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
33bb0 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
33bc0 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
33bd0 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
33be0 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
33bf0 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
33c00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
33c10 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
33c20 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
33c30 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
33c40 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
33c50 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
33c60 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
33c70 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
33c80 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
33c90 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
33ca0 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
33cb0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
33cc0 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
33cd0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
33ce0 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
33cf0 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
33d00 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
33d10 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
33d20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
33d30 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
33d40 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
33d50 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
33d60 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
33d70 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
33d80 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
33d90 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
33da0 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
33db0 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
33dc0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
33dd0 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
33de0 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
33df0 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
33e00 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
33e10 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
33e20 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
33e30 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
33e40 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
33e50 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
33e60 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
33e70 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
33e80 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
33e90 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
33ea0 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
33eb0 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
33ec0 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
33ed0 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
33ee0 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
33ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f00 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
33f10 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
33f20 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
33f30 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
33f40 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
33f50 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
33f60 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
33f70 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
33f80 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
33f90 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
33fa0 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
33fb0 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
33fc0 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
33fd0 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
33fe0 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
33ff0 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
34000 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
34010 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
34020 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
34030 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
34040 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
34050 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
34060 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
34070 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
34080 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
34090 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59  **.**  LOCKPROXY
340a0 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  DIR.**.**       
340b0 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
340c0 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20  fault directory 
340d0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72  used for lock pr
340e0 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a  oxy files that.*
340f0 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65  *       are name
34100 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
34110 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22  via the ":auto:"
34120 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20   setting.**.**  
34130 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
34140 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
34150 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ONS.**.**       
34160 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75  Permissions to u
34170 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  se when creating
34180 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72   a directory for
34190 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20   storing the.** 
341a0 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79        lock proxy
341b0 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65   files, only use
341c0 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59  d when LOCKPROXY
341d0 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a  DIR is not set..
341e0 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a  **    .**    .**
341f0 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62   As mentioned ab
34200 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c  ove, when compil
34210 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50  ed with SQLITE_P
34220 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
34230 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20  ING,.** setting 
34240 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
34250 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f  variable SQLITE_
34260 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
34270 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a  ING to 1 will.**
34280 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63   force proxy loc
34290 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  king to be used 
342a0 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61  for every databa
342b0 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20  se file opened, 
342c0 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f  and 0.** will fo
342d0 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72  rce automatic pr
342e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
342f0 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61  e disabled for a
34300 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
34310 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20  iles (explicity 
34320 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49  calling the SQLI
34330 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
34340 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a  FILE pragma or.*
34350 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f  * sqlite_file_co
34360 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74  ntrol API is not
34370 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c   affected by SQL
34380 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
34390 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a  LOCKING)..*/../*
343a0 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
343b0 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
343c0 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a  ble on MacOSX .*
343d0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
343e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
343f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
34400 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54  G_STYLE../*.** T
34410 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  he proxyLockingC
34420 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70  ontext has the p
34430 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72  ath and file str
34440 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20  uctures for the 
34450 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c  remote .** and l
34460 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73  ocal proxy files
34470 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65   in it.*/.typede
34480 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  f struct proxyLo
34490 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f  ckingContext pro
344a0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
344b0 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f  ;.struct proxyLo
344c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
344d0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
344e0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  File;         /*
344f0 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65   Open conch file
34500 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63   */.  char *conc
34510 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20  hFilePath;      
34520 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
34530 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  e conch file */.
34540 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b    unixFile *lock
34550 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f  Proxy;         /
34560 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63  * Open proxy loc
34570 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
34580 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b   *lockProxyPath;
34590 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
345a0 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f   of the proxy lo
345b0 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
345c0 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20  r *dbPath;      
345d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
345e0 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
345f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63  le */.  int conc
34600 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  hHeld;          
34610 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65       /* 1 if the
34620 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20   conch is held, 
34630 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a  -1 if lockless *
34640 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63  /.  void *oldLoc
34650 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
34660 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63   /* Original loc
34670 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72  kingcontext to r
34680 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20  estore on close 
34690 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  */.  sqlite3_io_
346a0 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
346b0 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f  OldMethod;     /
346c0 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d  * Original I/O m
346d0 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65  ethods for close
346e0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54   */.};../* .** T
346f0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  he proxy lock fi
34700 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  le path for the 
34710 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61  database at dbPa
34720 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  th is written in
34730 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68  to lPath, .** wh
34740 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ich must point t
34750 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c  o valid, writabl
34760 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65  e memory large e
34770 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c  nough for a maxL
34780 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c  en length.** fil
34790 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74  e path. .*/.stat
347a0 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c  ic int proxyGetL
347b0 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
347c0 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
347d0 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20   *lPath, size_t 
347e0 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c  maxLen){.  int l
347f0 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b  en;.  int dbLen;
34800 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65  .  int i;..#ifde
34810 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20  f LOCKPROXYDIR. 
34820 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
34830 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44  Path, LOCKPROXYD
34840 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c  IR, maxLen);.#el
34850 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44  se.# ifdef _CS_D
34860 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
34870 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20  DIR.  {.    if( 
34880 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52  !confstr(_CS_DAR
34890 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
348a0 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e  R, lPath, maxLen
348b0 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  ) ){.      OSTRA
348c0 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
348d0 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e    failed %s errn
348e0 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a  o=%d pid=%d\n",.
348f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
34900 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74  Path, errno, get
34910 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72  pid()));.      r
34920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
34930 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  RR_LOCK;.    }. 
34940 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74     len = strlcat
34950 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70  (lPath, "sqlitep
34960 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b  locks", maxLen);
34970 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a      .  }.# else.
34980 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
34990 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20  lPath, "/tmp/", 
349a0 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66  maxLen);.# endif
349b0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c  .#endif..  if( l
349c0 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27  Path[len-1]!='/'
349d0 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74   ){.    len = st
349e0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22  rlcat(lPath, "/"
349f0 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20  , maxLen);.  }. 
34a00 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d   .  /* transform
34a10 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20   the db path to 
34a20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e  a unique cache n
34a30 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d  ame */.  dbLen =
34a40 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50   (int)strlen(dbP
34a50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30  ath);.  for( i=0
34a60 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b  ; i<dbLen && (i+
34a70 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c  len+7)<(int)maxL
34a80 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  en; i++){.    ch
34a90 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d  ar c = dbPath[i]
34aa0 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65  ;.    lPath[i+le
34ab0 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f  n] = (c=='/')?'_
34ac0 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68  ':c;.  }.  lPath
34ad0 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20  [i+len]='\0';.  
34ae0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
34af0 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29  :auto:", maxLen)
34b00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45  ;.  OSTRACE(("GE
34b10 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  TLOCKPATH  proxy
34b20 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
34b30 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20  d=%d\n", lPath, 
34b40 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65  getpid()));.  re
34b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34b60 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74  }../* . ** Creat
34b70 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  es the lock file
34b80 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67   and any missing
34b90 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20   directories in 
34ba0 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61  lockPath. */.sta
34bb0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
34bc0 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  ateLockPath(cons
34bd0 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68  t char *lockPath
34be0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b  ){.  int i, len;
34bf0 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50  .  char buf[MAXP
34c00 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73  ATHLEN];.  int s
34c10 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61  tart = 0;.  .  a
34c20 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d  ssert(lockPath!=
34c30 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20  NULL);.  /* try 
34c40 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68  to create all th
34c50 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64  e intermediate d
34c60 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20  irectories */.  
34c70 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  len = (int)strle
34c80 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62  n(lockPath);.  b
34c90 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[0] = lockPath
34ca0 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b  [0];.  for( i=1;
34cb0 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20   i<len; i++ ){. 
34cc0 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b     if( lockPath[
34cd0 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20  i] == '/' && (i 
34ce0 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a  - start > 0) ){.
34cf0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b        /* only mk
34d00 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20  dir if leaf dir 
34d10 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72  != "." or "/" or
34d20 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69   ".." */.      i
34d30 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20  f( i-start>2 || 
34d40 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62  (i-start==1 && b
34d50 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
34d60 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
34d70 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20  = '/') .        
34d80 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20   || (i-start==2 
34d90 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
34da0 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
34db0 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a  t+1] != '.') ){.
34dc0 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27          buf[i]='
34dd0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \0';.        if(
34de0 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53 51   osMkdir(buf, SQ
34df0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f  LITE_DEFAULT_PRO
34e00 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e  XYDIR_PERMISSION
34e10 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  S) ){.          
34e20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
34e30 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
34e40 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20 20  !=EEXIST ) {.   
34e50 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
34e60 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
34e70 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74 69  H  FAILED creati
34e80 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20 20  ng %s, ".       
34e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 27                "'
34ea0 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  %s' proxy lock p
34eb0 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
34ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34ed0 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72 65         buf, stre
34ee0 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50  rror(err), lockP
34ef0 61 74 68 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ath, getpid()));
34f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
34f10 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20  urn err;.       
34f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
34f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
34f40 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  rt=i+1;.    }.  
34f50 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50    buf[i] = lockP
34f60 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53  ath[i];.  }.  OS
34f70 54 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f  TRACE(("CREATELO
34f80 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
34f90 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
34fa0 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  d\n", lockPath, 
34fb0 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 72 65  getpid()));.  re
34fc0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
34fd0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46   Create a new VF
34fe0 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  S file descripto
34ff0 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  r (stored in mem
35000 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
35010 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
35020 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68  loc) and open th
35030 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61  e file named "pa
35040 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20  th" in the file 
35050 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
35060 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
35070 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20  responsible not 
35080 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67  only for closing
35090 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
350a0 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f  ptor.** but also
350b0 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
350c0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
350d0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ed with the file
350e0 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a   descriptor..*/.
350f0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35100 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a  CreateUnixFile(.
35110 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35120 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  path,        /* 
35130 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77  path for the new
35140 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20   unixFile */.   
35150 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69   unixFile **ppFi
35160 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69  le,       /* uni
35170 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e  xFile created an
35180 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65  d returned by re
35190 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c  f */.    int isl
351a0 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20  ockfile         
351b0 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f    /* if non zero
351c0 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69   missing dirs wi
351d0 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  ll be created */
351e0 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20  .) {.  int fd = 
351f0 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  -1;.  unixFile *
35200 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
35210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
35220 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  t openFlags = O_
35230 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
35240 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75    sqlite3_vfs du
35250 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65  mmyVfs;.  int te
35260 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78  rrno = 0;.  Unix
35270 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
35280 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  d = NULL;..  /* 
35290 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  1. first try to 
352a0 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
352b0 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20  file.  ** 2. if 
352c0 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20  that fails, and 
352d0 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66  this is a lock f
352e0 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c  ile (not-conch),
352f0 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20   try creating.  
35300 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  ** the parent di
35310 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68  rectories and th
35320 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20  en try again..  
35330 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61  ** 3. if that fa
35340 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ils, try to open
35350 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f   the file read-o
35360 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69  nly.  ** otherwi
35370 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28  se return BUSY (
35380 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72  if lock file) or
35390 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68   CANTOPEN for th
353a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a  e conch file.  *
353b0 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69  /.  pUnused = fi
353c0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74  ndReusableFd(pat
353d0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20  h, openFlags);. 
353e0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
353f0 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
35400 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->fd;.  }else{. 
35410 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
35420 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
35430 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
35440 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
35450 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
35460 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
35470 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
35480 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72  <0 ){.    fd = r
35490 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
354a0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a   openFlags, 0);.
354b0 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
354c0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
354d0 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
354e0 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
354f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
35500 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
35510 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
35520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
35530 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
35540 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
35550 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
35560 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
35570 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
35580 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
35590 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
355a0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
355b0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72  ags, 0);.    ter
355c0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
355d0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
355e0 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
355f0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
35600 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
35610 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
35620 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
35630 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
35640 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35650 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
35660 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
35670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35680 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
35690 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
356a0 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
356b0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
356c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
356d0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
356e0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
356f0 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
35700 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
35710 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
35720 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
35730 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  NULL ){.    rc =
35740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
35750 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61     goto end_crea
35760 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20  te_proxy;.  }.  
35770 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
35780 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
35790 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46  );.  pNew->openF
357a0 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
357b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
357c0 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  yVfs, 0, sizeof(
357d0 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75  dummyVfs));.  du
357e0 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20  mmyVfs.pAppData 
357f0 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  = (void*)&autolo
35800 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75  ckIoFinder;.  du
35810 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22  mmyVfs.zName = "
35820 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65  dummy";.  pUnuse
35830 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55  d->fd = fd;.  pU
35840 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f  nused->flags = o
35850 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  penFlags;.  pNew
35860 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
35870 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66  sed;.  .  rc = f
35880 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64  illInUnixFile(&d
35890 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71  ummyVfs, fd, (sq
358a0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77  lite3_file*)pNew
358b0 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66  , path, 0);.  if
358c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
358d0 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d  ){.    *ppFile =
358e0 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72   pNew;.    retur
358f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
35900 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78  .end_create_prox
35910 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f  y:    .  robust_
35920 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20  close(pNew, fd, 
35930 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c  __LINE__);.  sql
35940 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
35950 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
35960 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75  pUnused);.  retu
35970 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
35980 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20   SQLITE_TEST./* 
35990 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
359a0 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
359b0 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
359c0 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
359d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
359e0 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64  id_num = 0;.#end
359f0 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  if..#define PROX
35a00 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31  Y_HOSTIDLEN    1
35a10 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65  6  /* conch file
35a20 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20   host id length 
35a30 2a 2f 0a 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79  */../* Not alway
35a40 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
35a50 20 68 65 61 64 65 72 73 20 61 73 20 69 74 20 6f   headers as it o
35a60 75 67 68 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78  ught to be */.ex
35a70 74 65 72 6e 20 69 6e 74 20 67 65 74 68 6f 73 74  tern int gethost
35a80 75 75 69 64 28 75 75 69 64 5f 74 20 69 64 2c 20  uuid(uuid_t id, 
35a90 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69 6d  const struct tim
35aa0 65 73 70 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f  espec *wait);../
35ab0 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49  * get the host I
35ac0 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69  D via gethostuui
35ad0 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73  d(), pHostID mus
35ae0 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59  t point to PROXY
35af0 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62  _HOSTIDLEN .** b
35b00 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65  ytes of writable
35b10 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
35b20 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48  ic int proxyGetH
35b30 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63  ostID(unsigned c
35b40 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
35b50 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73  t *pError){.  as
35b60 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49  sert(PROXY_HOSTI
35b70 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75  DLEN == sizeof(u
35b80 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65  uid_t));.  memse
35b90 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52  t(pHostID, 0, PR
35ba0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
35bb0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41  #if defined(__MA
35bc0 58 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d  X_OS_X_VERSION_M
35bd0 49 4e 5f 52 45 51 55 49 52 45 44 29 5c 0a 20 20  IN_REQUIRED)\.  
35be0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
35bf0 5f 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49  __MAC_OS_X_VERSI
35c00 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c  ON_MIN_REQUIRED<
35c10 31 30 35 30 0a 20 20 7b 0a 20 20 20 20 73 74 61  1050.  {.    sta
35c20 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
35c30 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
35c40 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
35c50 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
35c60 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75      if( gethostu
35c70 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69  uid(pHostID, &ti
35c80 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  meout) ){.      
35c90 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
35ca0 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f  .      if( pErro
35cb0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45  r ){.        *pE
35cc0 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20  rror = err;.    
35cd0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
35ce0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
35cf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
35d00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35d10 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69  R(pError);.#endi
35d20 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
35d30 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
35d40 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
35d50 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
35d60 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
35d70 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
35d80 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
35d90 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
35da0 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
35db0 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
35dc0 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
35dd0 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
35de0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
35df0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35e00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
35e10 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
35e20 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
35e30 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
35e40 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
35e50 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
35e60 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
35e70 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
35e80 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
35e90 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
35ea0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
35eb0 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
35ec0 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
35ed0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
35ee0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
35ef0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
35f00 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
35f10 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
35f20 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
35f30 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
35f40 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
35f50 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
35f60 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
35f70 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
35f80 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
35f90 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
35fa0 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
35fb0 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
35fc0 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
35fd0 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
35fe0 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
35ff0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
36000 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
36010 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
36020 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
36030 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
36040 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
36050 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
36060 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
36070 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
36080 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
36090 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
360a0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
360b0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
360c0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
360d0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
360e0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
360f0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
36100 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
36110 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
36120 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
36130 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
36140 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
36150 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
36160 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
36170 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
36180 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
36190 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
361a0 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
361b0 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
361c0 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
361d0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
361e0 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50  = -1;.  UNUSED_P
361f0 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49  ARAMETER(myHostI
36200 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  D);..  /* create
36210 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
36220 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
36230 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
36240 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
36250 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
36260 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
36270 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
36280 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
36290 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
362a0 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
362b0 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
362c0 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
362d0 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
362e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
362f0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
36300 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72  ,errmsg,"path er
36310 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
36320 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  nt)pathLen);.   
36330 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
36340 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65  ock;.  }.  /* re
36350 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e  ad the conch con
36360 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65  tent */.  readLe
36370 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
36380 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50  hFile->h, buf, P
36390 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
363a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64  , 0);.  if( read
363b0 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len<PROXY_PATHIN
363c0 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEX ){.    sqlit
363d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
363e0 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
363f0 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  g,"read error (l
36400 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61  en %d)",(int)rea
36410 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
36420 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
36430 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
36440 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
36450 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
36460 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73   */.  fd = robus
36470 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  t_open(tPath, (O
36480 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
36490 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28  EXCL), 0);.  if(
364a0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c   fd<0 ){.    sql
364b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
364c0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
364d0 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61  rmsg, "create fa
364e0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
364f0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
36500 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
36510 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66    if( osPwrite(f
36520 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c  d, buf, readLen,
36530 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29   0) != (ssize_t)
36540 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73  readLen ){.    s
36550 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36560 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
36570 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66  errmsg, "write f
36580 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
36590 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
365a0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
365b0 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50  .  if( rename(tP
365c0 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20  ath, cPath) ){. 
365d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
365e0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
365f0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e  g), errmsg, "ren
36600 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ame failed (%d)"
36610 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
36620 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
36630 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a  ;.  }.  rc = 0;.
36640 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
36650 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c  , "broke stale l
36660 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50  ock on %s\n", cP
36670 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63  ath);.  robust_c
36680 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63  lose(pFile, conc
36690 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  hFile->h, __LINE
366a0 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  __);.  conchFile
366b0 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63  ->h = fd;.  conc
366c0 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  hFile->openFlags
366d0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
366e0 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c  EAT;..end_breakl
366f0 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b  ock:.  if( rc ){
36700 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
36710 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
36720 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72  (tPath);.      r
36730 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
36740 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  e, fd, __LINE__)
36750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
36760 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
36770 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61  led to break sta
36780 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25  le lock on %s, %
36790 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72  s\n", cPath, err
367a0 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  msg);.  }.  retu
367b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
367c0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
367d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
367e0 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b  h file and break
367f0 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66   a stale lock if
36800 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64   the .** host id
36810 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61   matches..*/.sta
36820 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e  tic int proxyCon
36830 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
36840 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
36850 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63  yHostID, int loc
36860 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c  kType){.  proxyL
36870 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
36880 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
36890 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
368a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
368b0 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
368c0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
368d0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
368e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
368f0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73  OK;.  int nTries
36900 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74   = 0;.  struct t
36910 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64  imespec conchMod
36920 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65  Time;.  .  memse
36930 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c  t(&conchModTime,
36940 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68   0, sizeof(conch
36950 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20  ModTime));.  do 
36960 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
36970 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
36980 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
36990 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
369a0 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54  ockType);.    nT
369b0 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28  ries ++;.    if(
369c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
369d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
369e0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20  the lock failed 
369f0 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a  (busy):.       *
36a00 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68   1st try: get th
36a10 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68  e mod time of th
36a20 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e  e conch, wait 0.
36a30 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  5s and try again
36a40 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20  . .       * 2nd 
36a50 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65  try: fail if the
36a60 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65   mod time change
36a70 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20  d or host id is 
36a80 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20  different, wait 
36a90 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20  .       *       
36aa0 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74      10 sec and t
36ab0 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  ry again.       
36ac0 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b  * 3rd try: break
36ad0 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73   the lock unless
36ae0 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61   the mod time ha
36af0 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  s changed..     
36b00 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
36b10 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
36b20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f    if( osFstat(co
36b30 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  nchFile->h, &buf
36b40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
36b50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
36b60 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
36b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
36b80 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  RR_LOCK;.      }
36b90 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
36ba0 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20  ( nTries==1 ){. 
36bb0 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54         conchModT
36bc0 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ime = buf.st_mti
36bd0 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20 20 20  mespec;.        
36be0 75 73 6c 65 65 70 28 35 30 30 30 30 30 29 3b 20  usleep(500000); 
36bf0 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65 63 20  /* wait 0.5 sec 
36c00 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f 63 6b  and try the lock
36c10 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20   again*/.       
36c20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
36c30 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
36c40 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a  rt( nTries>1 );.
36c50 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 4d        if( conchM
36c60 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d  odTime.tv_sec !=
36c70 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
36c80 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20  c.tv_sec || .   
36c90 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69        conchModTi
36ca0 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20 62 75  me.tv_nsec != bu
36cb0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
36cc0 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20 20 20  v_nsec ){.      
36cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36ce0 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BUSY;.      }.  
36cf0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
36d00 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20  Tries==2 ){  .  
36d10 20 20 20 20 20 20 63 68 61 72 20 74 42 75 66 5b        char tBuf[
36d20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
36d30 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
36d40 6c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f  len = osPread(co
36d50 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66  nchFile->h, tBuf
36d60 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
36d70 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LEN, 0);.       
36d80 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20   if( len<0 ){.  
36d90 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
36da0 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
36db0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
36dc0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
36dd0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
36de0 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
36df0 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
36e00 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
36e10 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
36e20 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
36e30 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
36e40 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
36e50 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
36e60 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
36e70 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70     if( 0!=memcmp
36e80 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  (&tBuf[PROXY_HEA
36e90 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
36ea0 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
36eb0 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
36ec0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36ed0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
36ee0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
36ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
36f00 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
36f10 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61  ock on short rea
36f20 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d  d or a version m
36f30 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  ismatch */.     
36f40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36f50 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
36f60 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65   }.        uslee
36f70 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20  p(10000000); /* 
36f80 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20  wait 10 sec and 
36f90 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
36fa0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  in */.        co
36fb0 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d  ntinue; .      }
36fc0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  .      .      as
36fd0 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20  sert( nTries==3 
36fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
36ff0 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
37000 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
37010 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tID) ){.        
37020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37030 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b          if( lock
37040 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Type==EXCLUSIVE_
37050 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
37060 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
37070 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
37080 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
37090 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
370a0 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20  D_LOCK);        
370b0 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
370c0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
370d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
370e0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
370f0 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
37100 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
37110 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
37120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37130 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28      }.  } while(
37140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
37150 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a   && nTries<3 );.
37160 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
37170 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
37180 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
37190 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
371a0 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
371b0 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
371c0 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
371d0 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
371e0 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
371f0 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
37200 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
37210 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
37220 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
37230 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
37240 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
37250 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
37260 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
37270 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
37280 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
37290 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
372a0 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
372b0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
372c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
372d0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
372e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
372f0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
37300 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
37310 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37320 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
37330 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
37340 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
37350 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
37360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
37380 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37390 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
373a0 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
373b0 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
373c0 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
373d0 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
373e0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
373f0 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b  ];.    char lock
37400 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
37410 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70  ;.    char *temp
37420 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  LockPath = NULL;
37430 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
37440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
37450 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30   createConch = 0
37460 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64  ;.    int hostId
37470 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
37480 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  nt readLen = 0;.
37490 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f      int tryOldLo
374a0 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
374b0 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  int forceNewLock
374c0 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Path = 0;.    . 
374d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b     OSTRACE(("TAK
374e0 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
374f0 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
37500 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
37510 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
37520 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
37530 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37540 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
37550 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 20  getpid()));..   
37560 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f   rc = proxyGetHo
37570 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26  stID(myHostID, &
37580 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28  pError);.    if(
37590 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
375a0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
375b0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
375c0 6e 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  no = pError;.   
375d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
375e0 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
375f0 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68   rc = proxyConch
37600 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
37610 73 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43  stID, SHARED_LOC
37620 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
37630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37640 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
37650 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20  conch;.    }.   
37660 20 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69   /* read the exi
37670 73 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65  sting conch file
37680 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20   */.    readLen 
37690 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
376a0 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69  nixFile*)conchFi
376b0 6c 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20  le, 0, readBuf, 
376c0 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
376d0 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64  N);.    if( read
376e0 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  Len<0 ){.      /
376f0 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73  * I/O error: las
37700 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
37710 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20  ekAndRead */.   
37720 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
37730 72 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d  rno = conchFile-
37740 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
37750 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
37760 45 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  ERR_READ;.      
37770 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
37780 63 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ch;.    }else if
37790 28 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58  ( readLen<=(PROX
377a0 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
377b0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20  Y_HOSTIDLEN) || 
377c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65  .             re
377d0 61 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29  adBuf[0]!=(char)
377e0 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
377f0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61  ON ){.      /* a
37800 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76   short read or v
37810 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69  ersion format mi
37820 73 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20  smatch means we 
37830 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
37840 20 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63   new .      ** c
37850 6f 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20  onch file. .    
37860 20 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74    */.      creat
37870 65 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20  eConch = 1;.    
37880 7d 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20  }.    /* if the 
37890 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20  host id matches 
378a0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74  and the lock pat
378b0 68 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  h already exists
378c0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20   in the conch.  
378d0 20 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74    ** we'll try t
378e0 6f 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74  o use the path t
378f0 68 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27  here, if we can'
37900 74 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68  t open that path
37910 2c 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20  , we'll .    ** 
37920 72 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77  retry with a new
37930 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
37940 70 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20  path .    */.   
37950 20 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65   do { /* in case
37960 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
37970 61 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75  again for an :au
37980 74 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66  to: named lock f
37990 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ile */..      if
379a0 28 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26  ( !createConch &
379b0 26 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  & !forceNewLockP
379c0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68  ath ){.        h
379d0 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65  ostIdMatch = !me
379e0 6d 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52  mcmp(&readBuf[PR
379f0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
37a00 6d 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20  myHostID, .     
37a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f               PRO
37a30 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20  XY_HOSTIDLEN);. 
37a40 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
37a50 20 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20   conch has data 
37a60 63 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  compare the cont
37a70 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
37a80 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50  if( !pCtx->lockP
37a90 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20  roxyPath ){.    
37aa0 20 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74        /* for aut
37ab0 6f 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f  o-named local lo
37ac0 63 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68  ck file, just ch
37ad0 65 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20  eck the host ID 
37ae0 61 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20  and we'll.      
37af0 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20       ** use the 
37b00 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20  local lock file 
37b10 70 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65  path that's alre
37b20 61 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20  ady in there.   
37b30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37b40 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
37b50 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
37b60 20 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c      size_t pathL
37b70 65 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20  en = (readLen - 
37b80 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
37b90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
37ba0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
37bb0 61 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c  athLen>=MAXPATHL
37bc0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
37bd0 20 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50      pathLen=MAXP
37be0 41 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20  ATHLEN-1;.      
37bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37c00 20 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50      memcpy(lockP
37c10 61 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52  ath, &readBuf[PR
37c20 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
37c30 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20  pathLen);.      
37c40 20 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70        lockPath[p
37c50 61 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20  athLen] = 0;.   
37c60 20 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63           tempLoc
37c70 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68  kPath = lockPath
37c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
37c90 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31  yOldLockPath = 1
37ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
37cb0 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f   create a copy o
37cc0 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20  f the lock path 
37cd0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
37ce0 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  taken */.       
37cf0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
37d00 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20  keconch;.       
37d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
37d20 73 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74  se if( hostIdMat
37d30 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ch.             
37d40 20 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43    && !strncmp(pC
37d50 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
37d60 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58  h, &readBuf[PROX
37d70 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20  Y_PATHINDEX],.  
37d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d90 20 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e           readLen
37da0 2d 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  -PROXY_PATHINDEX
37db0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
37dc0 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20         /* conch 
37dd0 68 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61  host and lock pa
37de0 74 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  th match */.    
37df0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
37e00 61 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20  akeconch; .     
37e10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
37e20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20     .      /* if 
37e30 74 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20  the conch isn't 
37e40 77 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65  writable and doe
37e50 73 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63  sn't match, we c
37e60 61 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a  an't take it */.
37e70 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68        if( (conch
37e80 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26  File->openFlags&
37e90 4f 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a  O_RDWR) == 0 ){.
37ea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
37eb0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
37ec0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
37ed0 6f 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  onch;.      }.  
37ee0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69      .      /* ei
37ef0 74 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64  ther the conch d
37f00 69 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77  idn't match or w
37f10 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
37f20 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20   a new one */.  
37f30 20 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c      if( !pCtx->l
37f40 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a  ockProxyPath ){.
37f50 20 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74          proxyGet
37f60 4c 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64  LockPath(pCtx->d
37f70 62 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c  bPath, lockPath,
37f80 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
37f90 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61        tempLockPa
37fa0 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
37fb0 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65         /* create
37fc0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
37fd0 6f 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20  ock path _only_ 
37fe0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
37ff0 74 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  taken */.      }
38000 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
38010 20 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69   update conch wi
38020 74 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68  th host and path
38030 20 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c   (this will fail
38040 20 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73   if other proces
38050 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61  s.      ** has a
38060 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72   shared lock alr
38070 65 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f  eady), if the ho
38080 73 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75  st id matches, u
38090 73 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20  se the big.     
380a0 20 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20   ** stick..     
380b0 20 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65   */.      futime
380c0 73 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  s(conchFile->h, 
380d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28  NULL);.      if(
380e0 20 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20   hostIdMatch && 
380f0 21 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a  !createConch ){.
38100 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63          if( conc
38110 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26  hFile->pInode &&
38120 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f   conchFile->pIno
38130 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
38140 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
38150 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
38160 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
38170 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
38180 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
38190 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20          ** same 
381a0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
381b0 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
381c0 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  d lock. */.     
381d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
381e0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
381f0 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20 20 20   else {         
38200 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
38210 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
38220 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c  pFile, myHostID,
38230 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
38240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
38260 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
38270 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
38280 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
38290 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c 55 53  onchFile, EXCLUS
382a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
382b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
382c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
382d0 20 20 20 20 20 20 63 68 61 72 20 77 72 69 74 65        char write
382e0 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58  Buffer[PROXY_MAX
382f0 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20  CONCHLEN];.     
38300 20 20 20 69 6e 74 20 77 72 69 74 65 53 69 7a 65     int writeSize
38310 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 0a 20   = 0;.        . 
38320 20 20 20 20 20 20 20 77 72 69 74 65 42 75 66 66         writeBuff
38330 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29 50 52  er[0] = (char)PR
38340 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
38350 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
38360 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
38370 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20  OXY_HEADERLEN], 
38380 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f  myHostID, PROXY_
38390 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
383a0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
383b0 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c  ckProxyPath!=NUL
383c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  L ){.          s
383d0 74 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66  trlcpy(&writeBuf
383e0 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
383f0 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b  DEX], pCtx->lock
38400 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  ProxyPath, MAXPA
38410 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20  THLEN);.        
38420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
38430 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
38440 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
38450 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b  INDEX], tempLock
38460 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
38470 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
38480 20 20 20 20 20 77 72 69 74 65 53 69 7a 65 20 3d       writeSize =
38490 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
384a0 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69 74 65   + strlen(&write
384b0 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54  Buffer[PROXY_PAT
384c0 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20 20 20  HINDEX]);.      
384d0 20 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61    robust_ftrunca
384e0 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  te(conchFile->h,
384f0 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20   writeSize);.   
38500 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72       rc = unixWr
38510 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ite((sqlite3_fil
38520 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77  e *)conchFile, w
38530 72 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74  riteBuffer, writ
38540 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
38550 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69     fsync(conchFi
38560 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20  le->h);.        
38570 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64  /* If we created
38580 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c   a new conch fil
38590 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61  e (not just upda
385a0 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ted the contents
385b0 20 6f 66 20 61 20 0a 20 20 20 20