/ Hex Artifact Content
Login

Artifact 6815e3dd9a1507f2e36ba5a8dcd36b67ac60f3b0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 20  nix only */../* 
0850: 55 73 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  Use posix_falloc
0860: 61 74 65 28 29 20 69 66 20 69 74 20 69 73 20 61  ate() if it is a
0870: 76 61 69 6c 61 62 6c 65 0a 2a 2f 0a 23 69 66 20  vailable.*/.#if 
0880: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f  !defined(HAVE_PO
0890: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 5c  SIX_FALLOCATE) \
08a0: 0a 20 20 20 20 20 20 26 26 20 28 5f 58 4f 50 45  .      && (_XOPE
08b0: 4e 5f 53 4f 55 52 43 45 20 3e 3d 20 36 30 30 20  N_SOURCE >= 600 
08c0: 7c 7c 20 5f 50 4f 53 49 58 5f 43 5f 53 4f 55 52  || _POSIX_C_SOUR
08d0: 43 45 20 3e 3d 20 32 30 30 31 31 32 4c 29 0a 23  CE >= 200112L).#
08e0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 4f 53   define HAVE_POS
08f0: 49 58 5f 46 41 4c 4c 4f 43 41 54 45 20 31 0a 23  IX_FALLOCATE 1.#
0900: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
0910: 72 65 20 61 72 65 20 76 61 72 69 6f 75 73 20 6d  re are various m
0920: 65 74 68 6f 64 73 20 66 6f 72 20 66 69 6c 65 20  ethods for file 
0930: 6c 6f 63 6b 69 6e 67 20 75 73 65 64 20 66 6f 72  locking used for
0940: 20 63 6f 6e 63 75 72 72 65 6e 63 79 0a 2a 2a 20   concurrency.** 
0950: 63 6f 6e 74 72 6f 6c 3a 0a 2a 2a 0a 2a 2a 20 20  control:.**.**  
0960: 20 31 2e 20 50 4f 53 49 58 20 6c 6f 63 6b 69 6e   1. POSIX lockin
0970: 67 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c  g (the default),
0980: 0a 2a 2a 20 20 20 32 2e 20 4e 6f 20 6c 6f 63 6b  .**   2. No lock
0990: 69 6e 67 2c 0a 2a 2a 20 20 20 33 2e 20 44 6f 74  ing,.**   3. Dot
09a0: 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 0a 2a  -file locking,.*
09b0: 2a 20 20 20 34 2e 20 66 6c 6f 63 6b 28 29 20 6c  *   4. flock() l
09c0: 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20 35 2e 20  ocking,.**   5. 
09d0: 41 46 50 20 6c 6f 63 6b 69 6e 67 20 28 4f 53 58  AFP locking (OSX
09e0: 20 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 36 2e 20   only),.**   6. 
09f0: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
0a00: 70 68 6f 72 65 73 20 28 56 58 57 6f 72 6b 73 20  phores (VXWorks 
0a10: 6f 6e 6c 79 29 2c 0a 2a 2a 20 20 20 37 2e 20 70  only),.**   7. p
0a20: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 20 28 4f  roxy locking. (O
0a30: 53 58 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 53  SX only).**.** S
0a40: 74 79 6c 65 73 20 34 2c 20 35 2c 20 61 6e 64 20  tyles 4, 5, and 
0a50: 37 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  7 are only avail
0a60: 61 62 6c 65 20 6f 66 20 53 51 4c 49 54 45 5f 45  able of SQLITE_E
0a70: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0a80: 59 4c 45 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  YLE.** is define
0a90: 64 20 74 6f 20 31 2e 20 20 54 68 65 20 53 51 4c  d to 1.  The SQL
0aa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0ab0: 4e 47 5f 53 54 59 4c 45 20 61 6c 73 6f 20 65 6e  NG_STYLE also en
0ac0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 0a  ables automatic.
0ad0: 2a 2a 20 73 65 6c 65 63 74 69 6f 6e 20 6f 66 20  ** selection of 
0ae0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0af0: 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 62 61  locking style ba
0b00: 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sed on the files
0b10: 79 73 74 65 6d 0a 2a 2a 20 77 68 65 72 65 20 74  ystem.** where t
0b20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
0b30: 6f 63 61 74 65 64 2e 20 20 0a 2a 2f 0a 23 69 66  ocated.  .*/.#if
0b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0b50: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0b60: 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
0b70: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
0b80: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0b90: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0ba0: 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
0bb0: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
0bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0bd0: 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
0be0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0bf0: 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20 4f 53  ** Define the OS
0c00: 5f 56 58 57 4f 52 4b 53 20 70 72 65 2d 70 72 6f  _VXWORKS pre-pro
0c10: 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 74 6f 20  cessor macro to 
0c20: 31 20 69 66 20 62 75 69 6c 64 69 6e 67 20 6f 6e  1 if building on
0c30: 20 0a 2a 2a 20 76 78 77 6f 72 6b 73 2c 20 6f 72   .** vxworks, or
0c40: 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
0c50: 0a 23 69 66 6e 64 65 66 20 4f 53 5f 56 58 57 4f  .#ifndef OS_VXWO
0c60: 52 4b 53 0a 23 20 20 69 66 20 64 65 66 69 6e 65  RKS.#  if define
0c70: 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65  d(__RTP__) || de
0c80: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
0c90: 4c 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4f  L).#    define O
0ca0: 53 5f 56 58 57 4f 52 4b 53 20 31 0a 23 20 20 65  S_VXWORKS 1.#  e
0cb0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0cc0: 4f 53 5f 56 58 57 4f 52 4b 53 20 30 0a 23 20 20  OS_VXWORKS 0.#  
0cd0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ce0: 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e  .** These #defin
0cf0: 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65  es should enable
0d00: 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f   >2GB file suppo
0d10: 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74  rt on Posix if t
0d20: 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67  he.** underlying
0d30: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0d40: 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20  m supports it.  
0d50: 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a  If the OS lacks.
0d60: 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75  ** large file su
0d70: 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f  pport, these sho
0d80: 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  uld be no-ops..*
0d90: 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20  *.** Large file 
0da0: 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64  support can be d
0db0: 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68  isabled using th
0dc0: 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42  e -DSQLITE_DISAB
0dd0: 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a  LE_LFS switch.**
0de0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20   command line.  
0e00: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
0e10: 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d  y if you are com
0e20: 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72  piling.** on a r
0e30: 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65  ecent machine (e
0e40: 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20 62  x: RedHat 7.2) b
0e50: 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72  ut you want your
0e60: 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a   code to work.**
0e70: 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63   on an older mac
0e80: 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74  hine (ex: RedHat
0e90: 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63   6.0).  If you c
0ea0: 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74  ompile on RedHat
0eb0: 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20   7.2.** without 
0ec0: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53  this option, LFS
0ed0: 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74   is enable.  But
0ee0: 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78   LFS does not ex
0ef0: 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65  ist in the kerne
0f00: 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36  l.** in RedHat 6
0f10: 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20  .0, so the code 
0f20: 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e  won't work.  Hen
0f30: 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20  ce, for maximum 
0f40: 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62  binary.** portab
0f50: 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64  ility you should
0f60: 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2a 0a 2a 2a   omit LFS..**.**
0f70: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   The previous pa
0f80: 72 61 67 72 61 70 68 20 77 61 73 20 77 72 69 74  ragraph was writ
0f90: 74 65 6e 20 69 6e 20 32 30 30 35 2e 20 20 28 54  ten in 2005.  (T
0fa0: 68 69 73 20 70 61 72 61 67 72 61 70 68 20 69 73  his paragraph is
0fb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 32   written.** on 2
0fc0: 30 30 38 2d 31 31 2d 32 38 2e 29 20 54 68 65 73  008-11-28.) Thes
0fd0: 65 20 64 61 79 73 2c 20 61 6c 6c 20 4c 69 6e 75  e days, all Linu
0fe0: 78 20 6b 65 72 6e 65 6c 73 20 73 75 70 70 6f 72  x kernels suppor
0ff0: 74 20 6c 61 72 67 65 20 66 69 6c 65 73 2c 20 73  t large files, s
1000: 6f 0a 2a 2a 20 79 6f 75 20 73 68 6f 75 6c 64 20  o.** you should 
1010: 70 72 6f 62 61 62 6c 79 20 6c 65 61 76 65 20 4c  probably leave L
1020: 46 53 20 65 6e 61 62 6c 65 64 2e 20 20 42 75 74  FS enabled.  But
1030: 20 73 6f 6d 65 20 65 6d 62 65 64 64 65 64 20 70   some embedded p
1040: 6c 61 74 66 6f 72 6d 73 20 6d 69 67 68 74 0a 2a  latforms might.*
1050: 2a 20 6c 61 63 6b 20 4c 46 53 20 69 6e 20 77 68  * lack LFS in wh
1060: 69 63 68 20 63 61 73 65 20 74 68 65 20 53 51 4c  ich case the SQL
1070: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20  ITE_DISABLE_LFS 
1080: 6d 61 63 72 6f 20 6d 69 67 68 74 20 73 74 69 6c  macro might stil
1090: 6c 20 62 65 20 75 73 65 66 75 6c 2e 0a 2a 2f 0a  l be useful..*/.
10a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
10b0: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66  ISABLE_LFS.# def
10c0: 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20  ine _LARGE_FILE 
10d0: 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66        1.# ifndef
10e0: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
10f0: 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46  TS.#   define _F
1100: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20  ILE_OFFSET_BITS 
1110: 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66  64.# endif.# def
1120: 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53  ine _LARGEFILE_S
1130: 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a  OURCE 1.#endif..
1140: 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  /*.** standard i
1150: 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f  nclude files..*/
1160: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1170: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1180: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
1190: 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e  nclude <fcntl.h>
11a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
11b0: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  d.h>.#include <t
11c0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
11d0: 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
11e0: 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a  clude <errno.h>.
11f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1200: 4d 49 54 5f 57 41 4c 0a 23 69 6e 63 6c 75 64 65  MIT_WAL.#include
1210: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
1220: 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
1230: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1240: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1250: 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23   <sys/ioctl.h>.#
1260: 20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23   if OS_VXWORKS.#
1270: 20 20 69 6e 63 6c 75 64 65 20 3c 73 65 6d 61 70    include <semap
1280: 68 6f 72 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75  hore.h>.#  inclu
1290: 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a 23 20  de <limits.h>.# 
12a0: 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 65 20  else.#  include 
12b0: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 20 20  <sys/file.h>.#  
12c0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
12d0: 61 6d 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65  am.h>.# endif.#e
12e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
12f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1300: 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  YLE */..#if defi
1310: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
1320: 7c 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | (SQLITE_ENABLE
1330: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1340: 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 23  & !OS_VXWORKS).#
1350: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1360: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1370: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1380: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
1390: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
13a0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
13b0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
13c0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
13d0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
13e0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
13f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1400: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1410: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1420: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1430: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1440: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1450: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1460: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1470: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1480: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
1490: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
14a0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
14b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
14c0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
14d0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
14e0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
14f0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1500: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1510: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1520: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1530: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1540: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1550: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1560: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1570: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1580: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1590: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
15a0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
15b0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
15c0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
15d0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
15e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
15f0: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1600: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1610: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1620: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1630: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1640: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1650: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1660: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1670: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1680: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1690: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
16a0: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
16b0: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
16c0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
16d0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
16e0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
16f0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
1700: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
1710: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1720: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1740: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1750: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1760: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1770: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1780: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1790: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
17a0: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
17b0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
17c0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
17d0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
17e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
17f0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1800: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
1810: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1820: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1830: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1840: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1850: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1860: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1870: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1880: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1890: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
18a0: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
18b0: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
18c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
18d0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
18e0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
18f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1900: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
1910: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1920: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1930: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1940: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1950: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1960: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1970: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1980: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1990: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
19a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
19b0: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
19c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19d0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
19e0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
19f0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
1a00: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
1a10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1a20: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1a40: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1a50: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1a60: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1a70: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1a80: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1a90: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1aa0: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1ab0: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
1ac0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
1ad0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ae0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
1af0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
1b00: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
1b10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1b20: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1b40: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1b50: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1b60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b70: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1b80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1b90: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1ba0: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1bb0: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
1be0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
1bf0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
1c00: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
1c10: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1c20: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1c30: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1c40: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1c50: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1c60: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1c70: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1c80: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1c90: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb0: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1cc0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1cd0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ce0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1d10: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1d20: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1d30: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
1d40: 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c        /* Pre-all
1d50: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1d60: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1d70: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1da0: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1db0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1dd0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1de0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1df0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1e20: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1e30: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1e40: 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
1e50: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73       /* Device s
1e80: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
1e90: 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61 63  int deviceCharac
1ea0: 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20 20  teristics;      
1eb0: 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74      /* Precomput
1ec0: 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ed device charac
1ed0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e  teristics */.#en
1ee0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ef0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1f00: 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  YLE.  int openFl
1f10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f30: 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64   flags specified
1f40: 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65   at open() */.#e
1f50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1f60: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1f70: 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  TYLE || defined(
1f80: 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73  __APPLE__).  uns
1f90: 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20  igned fsFlags;  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1fc0: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1fd0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f   */.#endif.#if O
1fe0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
1ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
2000: 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20   *pId;          
2010: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
2020: 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  D */.#endif.#ifd
2030: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2040: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72    /* The next gr
2050: 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73  oup of variables
2060: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
2070: 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ck whether or no
2080: 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  t the.  ** trans
2090: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
20a0: 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66  n bytes 24-27 of
20b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
20c0: 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a  are updated.  **
20d0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61   whenever any pa
20e0: 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
20f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20  se changes.  An 
2100: 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20  assertion fault 
2110: 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20  will.  ** occur 
2120: 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64  if a file is upd
2130: 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73  ated without als
2140: 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74  o updating the t
2150: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
2160: 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74  counter.  This t
2170: 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61  est is made to a
2180: 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d  void new problem
2190: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
21a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69  .  ** one descri
21b0: 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  bed by ticket #3
21c0: 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73  584. .  */.  uns
21d0: 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73  igned char trans
21e0: 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54  CntrChng;   /* T
21f0: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
2200: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63  action counter c
2210: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
2220: 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61  gned char dbUpda
2230: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  te;        /* Tr
2240: 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ue if any part o
2250: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2260: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2270: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72  igned char inNor
2280: 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54  malWrite;   /* T
2290: 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d  rue if in a norm
22a0: 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  al write operati
22b0: 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 20 20  on */..#endif.  
22c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
22d0: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
22e0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
22f0: 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61  f mapping at pMa
2300: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  pRegion */.  sql
2310: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4f  ite3_int64 mmapO
2320: 72 69 67 73 69 7a 65 3b 20 20 20 20 20 2f 2a 20  rigsize;     /* 
2330: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2340: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
2350: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
2360: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4c 69 6d 69  3_int64 mmapLimi
2370: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  t;        /* Con
2380: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
2390: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23a0: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
23b0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
23c0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
23d0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
23e0: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
2410: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
2420: 72 65 66 73 20 2a 2f 0a 0a 23 69 66 64 65 66 20  refs */..#ifdef 
2430: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
2440: 20 49 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69   In test mode, i
2450: 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65  ncrease the size
2460: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
2470: 72 65 20 61 20 62 69 74 20 73 6f 20 74 68 61 74  re a bit so that
2480: 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72   .  ** it is lar
2490: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 74 72  ger than the str
24a0: 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 64 65  uct CrashFile de
24b0: 66 69 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63  fined in test6.c
24c0: 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50  ..  */.  char aP
24d0: 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64  adding[32];.#end
24e0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  if.};../*.** All
24f0: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
2500: 74 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72  the unixFile.ctr
2510: 6c 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a  lFlags bitmask:.
2520: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
2530: 49 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20  ILE_EXCL        
2540: 30 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  0x01     /* Conn
2550: 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65  ections from one
2560: 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f   process only */
2570: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2580: 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78  E_RDONLY      0x
2590: 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  02     /* Connec
25a0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
25b0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  y */.#define UNI
25c0: 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
25d0: 4c 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65  L 0x04     /* Pe
25e0: 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64  rsistent WAL mod
25f0: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
2600: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
2610: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49  YNC.# define UNI
2620: 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20  XFILE_DIRSYNC   
2630: 20 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72   0x08     /* Dir
2640: 65 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64  ectory sync need
2650: 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65  ed */.#else.# de
2660: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49  fine UNIXFILE_DI
2670: 52 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65  RSYNC    0x00.#e
2680: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49  ndif.#define UNI
2690: 58 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  XFILE_PSOW      
26a0: 20 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51    0x10     /* SQ
26b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
26c0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
26d0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26e0: 4c 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30  LE_DELETE      0
26f0: 78 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74  x20     /* Delet
2700: 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64  e on close */.#d
2710: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55  efine UNIXFILE_U
2720: 52 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20  RI         0x40 
2730: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
2740: 6d 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79  might have query
2750: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23   parameters */.#
2760: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2770: 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30  NOLOCK      0x80
2780: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69       /* Do no fi
2790: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
27a0: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
27b0: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
27c0: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
27d0: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
27e0: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
27f0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
2800: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
2810: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
2820: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
2830: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
2840: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2850: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2860: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2870: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2880: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2890: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
28a0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
28b0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
28c0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
28d0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
28e0: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
28f0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
2900: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
2910: 0a 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64  .** The threadid
2920: 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20   macro resolves 
2930: 74 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64  to the thread-id
2940: 20 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20   or to 0.  Used 
2950: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2960: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2970: 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  y..*/.#if SQLITE
2980: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66  _THREADSAFE.#def
2990: 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68  ine threadid pth
29a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73  read_self().#els
29b0: 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  e.#define thread
29c0: 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  id 0.#endif../*.
29d0: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69  ** Different Uni
29e0: 78 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72  x systems declar
29f0: 65 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66  e open() in diff
2a00: 65 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d  erent ways.  Sam
2a10: 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f  e use.** open(co
2a20: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f  nst char*,int,mo
2a30: 64 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75  de_t).  Others u
2a40: 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  se open(const ch
2a50: 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a  ar*,int,...)..**
2a60: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2a70: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65  is important whe
2a80: 6e 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65  n using a pointe
2a90: 72 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  r to the functio
2aa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66  n..**.** The saf
2ab0: 65 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20  est way to deal 
2ac0: 77 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d  with the problem
2ad0: 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73   is to always us
2ae0: 65 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a  e this wrapper.*
2af0: 2a 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68  * which always h
2b00: 61 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c  as the same well
2b10: 2d 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61  -defined interfa
2b20: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
2b30: 74 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73  t posixOpen(cons
2b40: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69  t char *zFile, i
2b50: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f  nt flags, int mo
2b60: 64 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  de){.  return op
2b70: 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c  en(zFile, flags,
2b80: 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   mode);.}../*.**
2b90: 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
2ba0: 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77  , calls to fchow
2bb0: 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67 65 72  n() will trigger
2bc0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 61 20   a message in a 
2bd0: 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20  security.** log 
2be0: 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66 72 6f  if they come fro
2bf0: 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65  m non-root proce
2c00: 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69 64 20  sses.  So avoid 
2c10: 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29  calling fchown()
2c20: 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f   if.** we are no
2c30: 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  t running as roo
2c40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2c50: 20 70 6f 73 69 78 46 63 68 6f 77 6e 28 69 6e 74   posixFchown(int
2c60: 20 66 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20   fd, uid_t uid, 
2c70: 67 69 64 5f 74 20 67 69 64 29 7b 0a 20 20 72 65  gid_t gid){.  re
2c80: 74 75 72 6e 20 67 65 74 65 75 69 64 28 29 20 3f  turn geteuid() ?
2c90: 20 30 20 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75   0 : fchown(fd,u
2ca0: 69 64 2c 67 69 64 29 3b 0a 7d 0a 0a 2f 2a 20 46  id,gid);.}../* F
2cb0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
2cc0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f   */.static int o
2cd0: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
2ce0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b  st char*, int*);
2cf0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2d00: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2d10: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2d20: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2d30: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2d40: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2d50: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2d60: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2d70: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2d80: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2d90: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2da0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2db0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2dc0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2dd0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2de0: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2df0: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2e00: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2e10: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2e20: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e40: 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c  of the sytem cal
2e50: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
2e60: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
2e70: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
2e80: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
2e90: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2ea0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2eb0: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
2ec0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
2ed0: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
2ee0: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
2ef0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
2f00: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
2f10: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
2f20: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
2f30: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
2f40: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
2f50: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
2f60: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
2f70: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
2f80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
2f90: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
2fa0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
2fb0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
2fc0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
2fd0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
2fe0: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
2ff0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3000: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
3010: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
3020: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
3030: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3040: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
3050: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
3060: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
3070: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3080: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
3090: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
30a0: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
30b0: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
30c0: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
30d0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
30e0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
30f0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3100: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
3110: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
3120: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
3130: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
3140: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3150: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
3160: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
3170: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
3180: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
3190: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
31a0: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
31b0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
31c0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
31d0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
31e0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
31f0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
3200: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
3210: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
3220: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
3230: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
3240: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
3250: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
3260: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
3270: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
3280: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
32a0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
32b0: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
32c0: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
32d0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
32e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
32f0: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
3300: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3310: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
3320: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
3330: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
3340: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
3350: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
3360: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
3370: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
3380: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
3390: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
33a0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
33b0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
33c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
33d0: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
33e0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
33f0: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
3400: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3410: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
3420: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
3430: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
3440: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
3450: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
3460: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3470: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
3480: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
3490: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
34a0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34b0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
34c0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
34d0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
34e0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
34f0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3500: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
3510: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3520: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
3530: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
3540: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
3550: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3560: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3570: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3580: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3590: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
35a0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
35b0: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
35c0: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
35d0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
35e0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
35f0: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
3600: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3610: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
3620: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
3630: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3640: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3650: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3660: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3670: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
3680: 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f 74  ad64   ((ssize_t
3690: 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69  (*)(int,void*,si
36a0: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ze_t,off_t))aSys
36b0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
36c0: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
36d0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
36e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
36f0: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
3700: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
3710: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
3720: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
3730: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3740: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
3750: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
3760: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
3770: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
3780: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
3790: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
37a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
37b0: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
37c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
37d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
37e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
37f0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
3800: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3810: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
3820: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3830: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3840: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3860: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
3870: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3880: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
3890: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
38a0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
38b0: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
38c0: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
38d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
38e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
38f0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3900: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3910: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
3920: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
3930: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
3940: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3950: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3960: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3970: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3980: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3990: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
39a0: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
39b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
39c0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
39d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
39e0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
39f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a00: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3a10: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3a20: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3a30: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
3a40: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3a50: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3a60: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
3a70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3a80: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3a90: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3aa0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
3ad0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
3ae0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
3af0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3b00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3b10: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3b20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3b30: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
3b40: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b50: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
3b60: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b70: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
3b80: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
3b90: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
3ba0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3bb0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
3bc0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
3bd0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
3be0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
3bf0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3c00: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3c10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3c20: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3c30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c40: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
3c50: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3c60: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
3c70: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3c80: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
3c90: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3ca0: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3cb0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3cc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3cd0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3ce0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3cf0: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3d00: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3d10: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3d20: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3d30: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d40: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73  _syscall_ptr)pos
3d50: 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20 30 20  ixFchown,     0 
3d60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3d70: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3d80: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3d90: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3da0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6d  urrent)..  { "mm
3db0: 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ap",       (sqli
3dc0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3dd0: 6d 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23  mmap,     0 },.#
3de0: 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28  define osMmap ((
3df0: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3e00: 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e  ize_t,int,int,in
3e10: 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c  t,off_t))aSyscal
3e20: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
3e30: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
3e40: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
3e50: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
3e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
3e70: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
3e80: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
3e90: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
3ea0: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78   of the.** "unix
3eb0: 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e  " VFSes.  Return
3ec0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20   SQLITE_OK opon 
3ed0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64  successfully upd
3ee0: 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73  ating the.** sys
3ef0: 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72  tem call pointer
3f00: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
3f10: 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73  OUND if there is
3f20: 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65   no configurable
3f30: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
3f40: 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a  named zName..*/.
3f50: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
3f60: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
3f70: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
3f80: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
3f90: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
3fa0: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
3fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3fc0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
3fd0: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
3fe0: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
3ff0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
4000: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
4010: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
4020: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
4030: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
4040: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
4050: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4060: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
4070: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4080: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
4090: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
40a0: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
40b0: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
40c0: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
40d0: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
40e0: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
40f0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
4100: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
4110: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4120: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4130: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4140: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4150: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4160: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4170: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
4180: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
4190: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
41a0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
41b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
41c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
41d0: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
41e0: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
41f0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
4200: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
4210: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
4220: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
4230: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
4240: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
4250: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
4260: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
4270: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
4280: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
4290: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
42a0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
42b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
42c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
42d0: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
42e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
42f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4300: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4310: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
4320: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
4330: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
4340: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4350: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4360: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
4370: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
4380: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
43a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
43b0: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
43c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
43d0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
43e0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
43f0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
4400: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
4410: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
4420: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
4430: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
4440: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
4450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
4460: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4470: 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c  unixGetSystemCal
4480: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4490: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
44a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
44b0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
44c0: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
44d0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
44e0: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
44f0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
4500: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
4510: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
4520: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4530: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4540: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
4550: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
4560: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
4570: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4580: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
4590: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
45a0: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
45b0: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
45c0: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
45d0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
45e0: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
45f0: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
4600: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
4610: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
4620: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
4630: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
4640: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
4650: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
4660: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4670: 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53   char *unixNextS
4680: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
4690: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
46a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
46b0: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
46c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
46d0: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
46e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
46f0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
4700: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
4710: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
4720: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
4730: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
4740: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4750: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
4760: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
4770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4780: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4790: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
47a0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
47b0: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
47c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
47d0: 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20  oke open().  Do 
47e0: 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  so multiple time
47f0: 73 2c 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68  s, until it eith
4800: 65 72 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a  er succeeds or.*
4810: 2a 20 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65  * fails for some
4820: 20 72 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68   reason other th
4830: 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20  an EINTR..**.** 
4840: 49 66 20 74 68 65 20 66 69 6c 65 20 63 72 65 61  If the file crea
4850: 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73  tion mode "m" is
4860: 20 30 20 74 68 65 6e 20 73 65 74 20 69 74 20 74   0 then set it t
4870: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f  o the default fo
4880: 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68  r.** SQLite.  Th
4890: 65 20 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c  e default is SQL
48a0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
48b0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f  _PERMISSIONS (no
48c0: 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20  rmally.** 0644) 
48d0: 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  as modified by t
48e0: 68 65 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e  he system umask.
48f0: 20 20 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c    If m is not 0,
4900: 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68   then.** make th
4910: 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
4920: 6d 6f 64 65 20 62 65 20 65 78 61 63 74 6c 79 20  mode be exactly 
4930: 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75  m ignoring the u
4940: 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mask..**.** The 
4950: 6d 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  m parameter will
4960: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c   be non-zero onl
4970: 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  y when creating 
4980: 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a  -wal, -journal,.
4990: 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65  ** and -shm file
49a0: 73 2e 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73  s.  We want thos
49b0: 65 20 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20  e files to have 
49c0: 2a 65 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61  *exactly* the sa
49d0: 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e  me.** permission
49e0: 73 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69  s as their origi
49f0: 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e  nal database, un
4a00: 61 64 75 6c 74 65 72 61 74 65 64 20 62 79 20 74  adulterated by t
4a10: 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20  he umask..** In 
4a20: 74 68 61 74 20 77 61 79 2c 20 69 66 20 61 20 64  that way, if a d
4a30: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
4a40: 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77  -rw-rw-rw or -rw
4a50: 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a  -rw-r-, and a.**
4a60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61   transaction cra
4a70: 73 68 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20  shes and leaves 
4a80: 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e  behind hot journ
4a90: 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  als, then any.**
4aa0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 69 73   process that is
4ab0: 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74   able to write t
4ac0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  o the database w
4ad0: 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65  ill also be able
4ae0: 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74   to.** recover t
4af0: 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e  he hot journals.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4b10: 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  obust_open(const
4b20: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c   char *z, int f,
4b30: 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e   mode_t m){.  in
4b40: 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d  t fd;.  mode_t m
4b50: 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49  2 = m ? m : SQLI
4b60: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
4b70: 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 64  PERMISSIONS;.  d
4b80: 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  o{.#if defined(O
4b90: 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64  _CLOEXEC).    fd
4ba0: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f   = osOpen(z,f|O_
4bb0: 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c  CLOEXEC,m2);.#el
4bc0: 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  se.    fd = osOp
4bd0: 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64  en(z,f,m2);.#end
4be0: 69 66 0a 20 20 7d 77 68 69 6c 65 28 20 66 64 3c  if.  }while( fd<
4bf0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
4c00: 52 20 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30  R );.  if( fd>=0
4c10: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30   ){.    if( m!=0
4c20: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
4c30: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
4c40: 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
4c50: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  (fd, &statbuf)==
4c60: 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61  0 .       && sta
4c70: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a  tbuf.st_size==0.
4c80: 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62         && (statb
4c90: 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  uf.st_mode&0777)
4ca0: 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=m .      ){.  
4cb0: 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66        osFchmod(f
4cc0: 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, m);.      }. 
4cd0: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
4ce0: 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20  (FD_CLOEXEC) && 
4cf0: 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  (!defined(O_CLOE
4d00: 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45  XEC) || O_CLOEXE
4d10: 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74  C==0).    osFcnt
4d20: 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
4d30: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
4d40: 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
4d50: 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  XEC);.#endif.  }
4d60: 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a  .  return fd;.}.
4d70: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
4d80: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
4d90: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
4da0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
4db0: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
4dc0: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
4dd0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
4de0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
4df0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
4e00: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
4e10: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
4e20: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
4e30: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
4e40: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
4e50: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
4e60: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
4e70: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
4e80: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
4e90: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
4ea0: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
4eb0: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
4ec0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
4ed0: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
4ee0: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
4ef0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
4f00: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
4f10: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
4f20: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
4f30: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
4f40: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
4f50: 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65  ic void unixEnte
4f60: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
4f70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
4f80: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
4f90: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
4fa0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
4fb0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
4fc0: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
4fd0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
4fe0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
4ff0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
5000: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
5010: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
5020: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5030: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
5040: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
5050: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
5060: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5070: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5080: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5090: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
50a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  .}.#endif...#if 
50b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
50c0: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
50d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
50e0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
50f0: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
5100: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
5110: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
5120: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
5130: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
5140: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
5150: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
5160: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
5170: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
5180: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5190: 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28  har *azFileLock(
51a0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
51b0: 20 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c    switch( eFileL
51c0: 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
51d0: 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NO_LOCK: return 
51e0: 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65  "NONE";.    case
51f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65   SHARED_LOCK: re
5200: 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20  turn "SHARED";. 
5210: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
5220: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52  _LOCK: return "R
5230: 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61  ESERVED";.    ca
5240: 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a  se PENDING_LOCK:
5250: 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47   return "PENDING
5260: 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c  ";.    case EXCL
5270: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
5280: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
5290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
52a0: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
52b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  #ifdef SQLITE_LO
52c0: 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50  CK_TRACE./*.** P
52d0: 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61  rint out informa
52e0: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c  tion about all l
52f0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
5300: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
5310: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
5320: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
5330: 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69  g locks on multi
5340: 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74  threaded.** plat
5350: 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62  forms.  Enable b
5360: 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68  y compiling with
5370: 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f   the -DSQLITE_LO
5380: 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d  CK_TRACE.** comm
5390: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
53a0: 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  on the compiler.
53b0: 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e    This code is n
53c0: 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65  ormally.** turne
53d0: 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  d off..*/.static
53e0: 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69   int lockTrace(i
53f0: 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73  nt fd, int op, s
5400: 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b  truct flock *p){
5410: 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  .  char *zOpName
5420: 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20  , *zType;.  int 
5430: 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72  s;.  int savedEr
5440: 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46  rno;.  if( op==F
5450: 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _GETLK ){.    zO
5460: 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b  pName = "GETLK";
5470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
5480: 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_SETLK ){.    
5490: 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b  zOpName = "SETLK
54a0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
54b0: 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20  s = osFcntl(fd, 
54c0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
54d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
54e0: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
54f0: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
5500: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
5510: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
5520: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
5530: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5540: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
5550: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
5560: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
5570: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
5580: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
5590: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
55a0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
55b0: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
55c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
55d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
55e0: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
55f0: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f  K_SET );.  s = o
5600: 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70  sFcntl(fd, op, p
5610: 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20  );.  savedErrno 
5620: 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74  = errno;.  sqlit
5630: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
5640: 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73  cntl %d %d %s %s
5650: 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %d %d %d %d\n",
5660: 0a 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20  .     threadid, 
5670: 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79  fd, zOpName, zTy
5680: 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74  pe, (int)p->l_st
5690: 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c  art, (int)p->l_l
56a0: 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d  en,.     (int)p-
56b0: 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66  >l_pid, s);.  if
56c0: 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d  ( s==(-1) && op=
56d0: 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e  =F_SETLK && (p->
56e0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
56f0: 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  || p->l_type==F_
5700: 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74  WRLCK) ){.    st
5710: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20  ruct flock l2;. 
5720: 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20     l2 = *p;.    
5730: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  osFcntl(fd, F_GE
5740: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
5750: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
5760: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
5770: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
5780: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
5790: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
57a0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
57b0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
57c0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
57d0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
57e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
57f0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
5800: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
5810: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
5820: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5830: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
5840: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
5850: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
5860: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
5870: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
5880: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
5890: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
58a0: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
58b0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75    return s;.}.#u
58c0: 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65  ndef osFcntl.#de
58d0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63  fine osFcntl loc
58e0: 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a  kTrace.#endif /*
58f0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
5900: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CE */../*.** Ret
5910: 72 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63  ry ftruncate() c
5920: 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64  alls that fail d
5930: 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2f 0a 73  ue to EINTR.*/.s
5940: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
5950: 5f 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68  _ftruncate(int h
5960: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
5970: 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sz){.  int rc;. 
5980: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75   do{ rc = osFtru
5990: 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68  ncate(h,sz); }wh
59a0: 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
59b0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
59c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
59d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
59e0: 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61  translates a sta
59f0: 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e  ndard POSIX errn
5a00: 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65  o code into some
5a10: 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20  thing.** useful 
5a20: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f  to the clients o
5a30: 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66 75  f the sqlite3 fu
5a40: 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66  nctions.  Specif
5a50: 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a  ically, it is.**
5a60: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61   intended to tra
5a70: 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74 79  nslate a variety
5a80: 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22 20   of "try again" 
5a90: 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49  errors into SQLI
5aa0: 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61  TE_BUSY.** and a
5ab0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65   variety of "ple
5ac0: 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69  ase close the fi
5ad0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f  le descriptor NO
5ae0: 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a  W" errors into .
5af0: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  ** SQLITE_IOERR.
5b00: 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75  ** .** Errors du
5b10: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
5b20: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72  ion of locks, or
5b30: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
5b40: 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a  port for locks,.
5b50: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65  ** should handle
5b60: 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50   ENOLCK, ENOTSUP
5b70: 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70  , EOPNOTSUPP sep
5b80: 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  arately..*/.stat
5b90: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72  ic int sqliteErr
5ba0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
5bb0: 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c  (int posixError,
5bc0: 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72   int sqliteIOErr
5bd0: 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f  ) {.  switch (po
5be0: 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20  sixError) {.#if 
5bf0: 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  0.  /* At one po
5c00: 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77 61  int this code wa
5c10: 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20  s not commented 
5c20: 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20  out. In theory, 
5c30: 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
5c40: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
5c50: 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66 75   hit, as this fu
5c60: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
5c70: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
5c80: 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e  er.  ** a lockin
5c90: 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  g-related functi
5ca0: 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29  on (i.e. fcntl()
5cb0: 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e  ) has returned n
5cc0: 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a  on-zero with.  *
5cd0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  * the value of e
5ce0: 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73  rrno as the firs
5cf0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63  t argument. Sinc
5d00: 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  e a system call 
5d10: 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a  has failed,.  **
5d20: 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65   errno should be
5d30: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a   non-zero..  **.
5d40: 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69    ** Despite thi
5d50: 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c  s, if errno real
5d60: 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73  ly is zero, we s
5d70: 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20  till don't want 
5d80: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
5d90: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79  QLITE_OK. The sy
5da0: 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64  stem call failed
5db0: 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c  , and *some* SQL
5dc0: 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64  ite error should
5dd0: 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61   be.  ** propaga
5de0: 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ted back to the 
5df0: 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69  caller. Commenti
5e00: 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f  ng this branch o
5e10: 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d  ut means errno==
5e20: 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68  0.  ** will be h
5e30: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22 64  andled by the "d
5e40: 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65  efault:" case be
5e50: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  low..  */.  case
5e60: 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20   0: .    return 
5e70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
5e80: 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e  f..  case EAGAIN
5e90: 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f  :.  case ETIMEDO
5ea0: 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59  UT:.  case EBUSY
5eb0: 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a  :.  case EINTR:.
5ec0: 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20    case ENOLCK:  
5ed0: 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e  .    /* random N
5ee0: 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20  FS retry error, 
5ef0: 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69  unless during fi
5f00: 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le system suppor
5f10: 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73  t .     * intros
5f20: 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63  pection, in whic
5f30: 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65  h it actually me
5f40: 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73  ans what it says
5f50: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5f60: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
5f70: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
5f80: 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69  .    /* EACCES i
5f90: 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75  s like EAGAIN du
5fa0: 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65  ring locking ope
5fb0: 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74  rations, but not
5fc0: 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a   any other time*
5fd0: 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  /.    if( (sqlit
5fe0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
5ff0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
6000: 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  .        (sqlite
6010: 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f  IOErr == SQLITE_
6020: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c  IOERR_UNLOCK) ||
6030: 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74   .        (sqlit
6040: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6050: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
6060: 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  |.        (sqlit
6070: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6080: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
6090: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
60a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
60b0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
60c0: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
60d0: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
60e0: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
60f0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
6100: 20 20 20 20 0a 20 20 2f 2a 20 45 44 45 41 44 4c      .  /* EDEADL
6110: 4b 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  K is only possib
6120: 6c 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  le if a call to 
6130: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 57 29 20  fcntl(F_SETLKW) 
6140: 69 73 20 6d 61 64 65 2e 20 41 6e 64 0a 20 20 2a  is made. And.  *
6150: 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 6e 65  * this module ne
6160: 76 65 72 20 6d 61 6b 65 73 20 73 75 63 68 20 61  ver makes such a
6170: 20 63 61 6c 6c 2e 20 41 6e 64 20 74 68 65 20 63   call. And the c
6180: 6f 64 65 20 69 6e 20 53 51 4c 69 74 65 20 69 74  ode in SQLite it
6190: 73 65 6c 66 20 0a 20 20 2a 2a 20 61 73 73 65 72  self .  ** asser
61a0: 74 73 20 74 68 61 74 20 53 51 4c 49 54 45 5f 49  ts that SQLITE_I
61b0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 69 73 20  OERR_BLOCKED is 
61c0: 6e 65 76 65 72 20 72 65 74 75 72 6e 65 64 2e 20  never returned. 
61d0: 46 6f 72 20 74 68 65 73 65 20 72 65 61 73 6f 6e  For these reason
61e0: 73 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65  s.  ** this case
61f0: 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
6200: 65 64 20 6f 75 74 2e 20 49 66 20 74 68 65 20 73  ed out. If the s
6210: 79 73 74 65 6d 20 64 6f 65 73 20 73 65 74 20 65  ystem does set e
6220: 72 72 6e 6f 20 74 6f 20 45 44 45 41 44 4c 4b 2c  rrno to EDEADLK,
6230: 0a 20 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  .  ** the defaul
6240: 74 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  t SQLITE_IOERR_X
6250: 58 58 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  XX code will be 
6260: 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 23 69 66  returned. */.#if
6270: 20 30 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c   0.  case EDEADL
6280: 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K:.    return SQ
6290: 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
62a0: 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a  ED;.#endif.    .
62b0: 23 69 66 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d  #if EOPNOTSUPP!=
62c0: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
62d0: 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20 20 20 20  OPNOTSUPP: .    
62e0: 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e  /* something wen
62f0: 74 20 74 65 72 72 69 62 6c 79 20 61 77 72 79 2c  t terribly awry,
6300: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
6310: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6320: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
6330: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
6340: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
6350: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
6360: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
6370: 65 66 20 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  ef ENOTSUP.  cas
6380: 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20  e ENOTSUP: .    
6390: 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64 2c 20 75  /* invalid fd, u
63a0: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
63b0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
63c0: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
63d0: 69 6e 20 77 68 69 63 68 20 0a 20 20 20 20 20 2a  in which .     *
63e0: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
63f0: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
6400: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  */.#endif.  case
6410: 20 45 49 4f 3a 0a 20 20 63 61 73 65 20 45 42 41   EIO:.  case EBA
6420: 44 46 3a 0a 20 20 63 61 73 65 20 45 49 4e 56 41  DF:.  case EINVA
6430: 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f 54 43 4f  L:.  case ENOTCO
6440: 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e 4f 44 45  NN:.  case ENODE
6450: 56 3a 0a 20 20 63 61 73 65 20 45 4e 58 49 4f 3a  V:.  case ENXIO:
6460: 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a  .  case ENOENT:.
6470: 23 69 66 64 65 66 20 45 53 54 41 4c 45 20 20 20  #ifdef ESTALE   
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 2f 2a 20 45 53 54 41 4c 45 20 69 73 20 6e    /* ESTALE is n
64a0: 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e  ot defined on In
64b0: 74 65 72 69 78 20 73 79 73 74 65 6d 73 20 2a 2f  terix systems */
64c0: 0a 20 20 63 61 73 65 20 45 53 54 41 4c 45 3a 0a  .  case ESTALE:.
64d0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 4e  #endif.  case EN
64e0: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
64f0: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
6500: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
6510: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
6520: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
6530: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
6540: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
6550: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
6560: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
65b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65c0: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
65d0: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
65e0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
65f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6600: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
6610: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
6620: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
6630: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
6640: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
6650: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
6660: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
6670: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
6680: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
6690: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
66a0: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
66b0: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
66c0: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
66d0: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
66e0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
66f0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
6700: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
6720: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
6730: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
6740: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
6750: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
6760: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
6770: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
6780: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
6790: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
67a0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
67b0: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
67c0: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
67d0: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
67e0: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
67f0: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
6800: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
6810: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
6820: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
6830: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
6840: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
6850: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
6860: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
6870: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
6880: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
6890: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
68a0: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
68b0: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
68c0: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
68d0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
68e0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
68f0: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
6900: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
6910: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
6920: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
6950: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
6960: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
6970: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
6980: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
6990: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
69a0: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
69b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
69c0: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
69d0: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
69e0: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
69f0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
6a00: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
6a10: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
6a20: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
6a30: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
6a40: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
6a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
6a60: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6a70: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
6a80: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
6a90: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
6aa0: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
6ab0: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
6ac0: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
6ad0: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
6ae0: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
6af0: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
6b00: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
6b10: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
6b20: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
6b30: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
6b40: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
6b50: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
6b60: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
6b70: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
6b80: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
6b90: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
6ba0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
6bb0: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
6bc0: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
6bd0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
6be0: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
6bf0: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
6c00: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
6c10: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
6c20: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
6c30: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
6c40: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
6c50: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
6c60: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
6c70: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
6c80: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
6c90: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
6ca0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6cb0: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
6cc0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
6cd0: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
6ce0: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
6cf0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
6d00: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
6d10: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
6d20: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
6d30: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
6d40: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
6d50: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
6d60: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
6d70: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
6d80: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
6d90: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
6da0: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
6db0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
6dc0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
6dd0: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
6de0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
6df0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
6e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
6e10: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
6e20: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
6e30: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
6e40: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
6e50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
6e60: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
6e70: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
6e80: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
6e90: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
6ea0: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
6eb0: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
6ec0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
6ed0: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
6ee0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
6ef0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
6f00: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
6f10: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
6f20: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
6f30: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
6f40: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
6f50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
6f60: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6f70: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
6f80: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
6f90: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
6fa0: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
6fb0: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
6fc0: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
6fd0: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
6fe0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
6ff0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
7000: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
7010: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7020: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
7030: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
7040: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
7050: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
7060: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
7070: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
70a0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
70b0: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
70c0: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
70d0: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
70e0: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
70f0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
7100: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
7110: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
7120: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
7130: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7140: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7150: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
7160: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
7170: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
7180: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7190: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
71a0: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
71b0: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
71c0: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
71d0: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
71e0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
71f0: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
7200: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
7210: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
7220: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
7230: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
7240: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
7250: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
7260: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
7270: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
7280: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
7290: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
72a0: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
72b0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
72c0: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
72d0: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
72e0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
72f0: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
7300: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
7310: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
7320: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7330: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
7340: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
7350: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
7360: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
7370: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
7380: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
7390: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
73a0: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
73b0: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
73c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
73d0: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
73e0: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
73f0: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
7400: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
7410: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
7420: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
7430: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
7440: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
7450: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
7460: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
7470: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
7480: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
7490: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
74a0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
74b0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
74c0: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
74d0: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
74e0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
74f0: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
7500: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
7510: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
7520: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
7530: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
7540: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
7550: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
7560: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
7570: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
7580: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
7590: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
75a0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
75b0: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
75c0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
75d0: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
75e0: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
75f0: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
7600: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
7610: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
7620: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
7630: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
7640: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
7650: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
7660: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
7680: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
7690: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
76a0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
7710: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
7780: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
7790: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
77b0: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
77c0: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
77d0: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
77e0: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
77f0: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
7800: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
7810: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
7820: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
7830: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
7840: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
7850: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
7860: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
7870: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
7880: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
7890: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
78a0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
78b0: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
78c0: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
78d0: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
78e0: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
78f0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7900: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
7910: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
7920: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
7930: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
7940: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
7950: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
7960: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
7970: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
7980: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
7990: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
79a0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
79b0: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
79c0: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
79d0: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
79e0: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
79f0: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
7a00: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
7a10: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
7a20: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
7a30: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
7a40: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
7a50: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
7a60: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
7a70: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
7a80: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
7a90: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
7aa0: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
7ab0: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
7ac0: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
7ad0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
7ae0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
7af0: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
7b00: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
7b10: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
7b20: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
7b30: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
7b40: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
7b50: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
7b60: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
7b70: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
7b80: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
7b90: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
7ba0: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
7bb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
7bc0: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
7bd0: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
7be0: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
7bf0: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
7c00: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
7c10: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
7c20: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
7c30: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
7c40: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
7c50: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
7c60: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
7c70: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
7c80: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
7c90: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
7ca0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
7cb0: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
7cc0: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
7cd0: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
7ce0: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
7cf0: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
7d00: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
7d10: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
7d20: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
7d30: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
7d40: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
7d50: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
7d60: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
7d70: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
7d80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
7d90: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
7da0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
7db0: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
7dc0: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
7dd0: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
7de0: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
7df0: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
7e00: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
7e10: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
7e20: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
7e30: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
7e40: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
7e50: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
7e60: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
7e70: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
7e80: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
7e90: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
7ea0: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
7eb0: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
7ec0: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
7ed0: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
7ee0: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
7ef0: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
7f00: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
7f10: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
7f20: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
7f30: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
7f40: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
7f50: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
7f60: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
7f70: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
7f80: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
7f90: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
7fa0: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
7fb0: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
7fc0: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
7fd0: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
7fe0: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
7ff0: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
8000: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
8010: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
8020: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
8030: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
8040: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
8050: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
8060: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
8070: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
8080: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
8090: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
80a0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
80b0: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
80c0: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
80d0: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
80e0: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
80f0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
8100: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
8110: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
8120: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
8130: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
8140: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
8150: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
8160: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
8170: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
8180: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
8190: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
81a0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
81b0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
81c0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
81d0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
81e0: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
81f0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
8200: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
8210: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
8220: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
8230: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
8240: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
8250: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
8260: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
8270: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
8280: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
8290: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
82a0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
82b0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
82c0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
82d0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
82e0: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
82f0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
8300: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
8310: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
8320: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
8330: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
8340: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
8350: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
8360: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
8370: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
8380: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
8390: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
83a0: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
83b0: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
83c0: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
83d0: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
83e0: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
83f0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
8400: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
8410: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
8420: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
8430: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8440: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
8450: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
8460: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
8470: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
8480: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
8490: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
84a0: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
84b0: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
84c0: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
84d0: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
84e0: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
84f0: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
8500: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
8510: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
8520: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8530: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
8540: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
8550: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
8560: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
8570: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
8580: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
8590: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
85a0: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
85b0: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
85c0: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
85d0: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
85e0: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
85f0: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
8600: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
8610: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
8620: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
8630: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
8640: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
8650: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
8660: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
8670: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
8680: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
8690: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
86a0: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
86b0: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
86c0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
86d0: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
86e0: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
86f0: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
8700: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
8710: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
8720: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
8730: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
8740: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
8750: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
8760: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
8770: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
8780: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
8790: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
87a0: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
87b0: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
87c0: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
87d0: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
87e0: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
87f0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
8800: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
8810: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
8820: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
8830: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
8840: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
8850: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
8860: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
8870: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
8880: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
8890: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
88a0: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
88b0: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
88c0: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
88d0: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
88e0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
88f0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
8900: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
8910: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
8920: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
8930: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
8940: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
8950: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
8960: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
8970: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
8980: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
8990: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
89a0: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
89b0: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
89c0: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
89d0: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
89e0: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
89f0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
8a00: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
8a10: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
8a20: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
8a30: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
8a40: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
8a50: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
8a60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
8a70: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
8a80: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
8a90: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
8aa0: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
8ab0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
8ac0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
8ad0: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
8ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8af0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
8b00: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
8b10: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
8b20: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
8b30: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
8b40: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
8b50: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
8b60: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
8b80: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
8b90: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
8ba0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
8bb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
8bc0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
8bd0: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
8be0: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
8bf0: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
8c00: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
8c10: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
8c20: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
8c30: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
8c40: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
8c50: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
8c60: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
8c70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8c80: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
8c90: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
8ca0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
8cb0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
8cc0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
8cd0: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
8ce0: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
8cf0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
8d00: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
8d10: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
8d20: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
8d30: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
8d40: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
8d50: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
8d60: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
8d70: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
8da0: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
8db0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8dc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
8dd0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
8de0: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
8df0: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
8e00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8e10: 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20   bProcessLock;  
8e20: 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69     /* An exclusi
8e30: 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20  ve process lock 
8e40: 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  is held */.  int
8e50: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e70: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
8e80: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
8e90: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
8ea0: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
8eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
8ec0: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
8ed0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
8ee0: 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  inode */.  int n
8ef0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
8f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f10: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
8f20: 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a  ing file locks *
8f30: 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  /.  UnixUnusedFd
8f40: 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20   *pUnused;      
8f50: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
8f60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8f70: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69  o close */.  uni
8f80: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78  xInodeInfo *pNex
8f90: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
8fa0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78  List of all unix
8fb0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8fc0: 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  s */.  unixInode
8fd0: 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20  Info *pPrev;    
8fe0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e         /*    ...
8ff0: 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  . doubly linked 
9000: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
9010: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
9020: 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  LE.  unsigned lo
9030: 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79  ng long sharedBy
9040: 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20  te;  /* for AFP 
9050: 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64  simulated shared
9060: 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a   lock */.#endif.
9070: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
9080: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20   sem_t *pSem;   
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20   /* Named POSIX 
90b0: 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63  semaphore */.  c
90c0: 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58  har aSemName[MAX
90d0: 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f  _PATHNAME+2];  /
90e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73  * Name of that s
90f0: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64  emaphore */.#end
9100: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  if.};../*.** A l
9110: 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78  ists of all unix
9120: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
9130: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69  s..*/.static uni
9140: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64  xInodeInfo *inod
9150: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
9160: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9170: 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  on - unixLogErro
9180: 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79 20 65  r_x(), is only e
9190: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
91a0: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e 69 78  he macro.** unix
91b0: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
91c0: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
91d0: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
91e0: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
91f0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72 72 6e  unction and errn
9200: 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 73 65  o has been.** se
9210: 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  t. It logs a mes
9220: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
9230: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
9240: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
9250: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6e  value of.** errn
9260: 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  o and, if possib
9270: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
9280: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
9290: 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  t from strerror(
92a0: 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72 6f 72  ) or.** strerror
92b0: 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  _r()..**.** The 
92c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
92d0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
92e0: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
92f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
9300: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
9310: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
9320: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
9330: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
9340: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
9350: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
9360: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
9370: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
9380: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
9390: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
93a0: 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22  d (e.g. "unlink"
93b0: 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20 74 68  , "open") and th
93c0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
93d0: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 0a 2a  e-system path,.*
93e0: 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  * if any..*/.#de
93f0: 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72 72 6f  fine unixLogErro
9400: 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75 6e 69  r(a,b,c)     uni
9410: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
9420: 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  a,b,c,__LINE__).
9430: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
9440: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
9450: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
9480: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   code */.  const
9490: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
94a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
94b0: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
94c0: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
94d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
94e0: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
94f0: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
9500: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9510: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
9520: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
9530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
9540: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
9550: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
9560: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
9570: 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20 20 20  ar *zErr;       
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 74   Message from st
95a0: 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71 75 69  rerror() or equi
95b0: 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  valent */.  int 
95c0: 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20  iErrno = errno; 
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
95e0: 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65 72 72  aved syscall err
95f0: 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20  or number */..  
9600: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  /* If this is no
9610: 74 20 61 20 74 68 72 65 61 64 73 61 66 65 20 62  t a threadsafe b
9620: 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54 48 52  uild (SQLITE_THR
9630: 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74 68 65  EADSAFE==0), the
9640: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 73  n use.  ** the s
9650: 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63 74 69  trerror() functi
9660: 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  on to obtain the
9670: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
9680: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
9690: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
96a0: 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73   errno. Otherwis
96b0: 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 5f  e, use strerror_
96c0: 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66 20 53  r()..  */ .#if S
96d0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
96e0: 20 26 26 20 64 65 66 69 6e 65 64 28 48 41 56 45   && defined(HAVE
96f0: 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20 20 63  _STRERROR_R).  c
9700: 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a 20 20  har aErr[80];.  
9710: 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30 2c 20  memset(aErr, 0, 
9720: 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b 0a 20  sizeof(aErr));. 
9730: 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a 0a 20   zErr = aErr;.. 
9740: 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f 52 5f   /* If STRERROR_
9750: 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20 62 79  R_CHAR_P (set by
9760: 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69 70 74   autoconf script
9770: 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e 55 20  s) or __USE_GNU 
9780: 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20 2a 2a  is defined,.  **
9790: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
97a0: 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65 73   system provides
97b0: 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f 6e   the GNU version
97c0: 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72 28 29   of strerror_r()
97d0: 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74 75 72   that.  ** retur
97e0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
97f0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
9800: 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
9810: 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f 69 6e  ssage. That poin
9820: 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 70 6f  ter .  ** may po
9830: 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c 20 6f  int to aErr[], o
9840: 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74 20 74  r it may point t
9850: 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20 73 74  o some static st
9860: 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72 65 2e  orage somewhere.
9870: 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
9880: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
9890: 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64 65  e system provide
98a0: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
98b0: 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73 74 72  ion of .  ** str
98c0: 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69 63 68  error_r(), which
98d0: 20 61 6c 77 61 79 73 20 77 72 69 74 65 73 20 61   always writes a
98e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
98f0: 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20 20 2a  into aErr[]..  *
9900: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f  *.  ** If the co
9910: 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 61  de incorrectly a
9920: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
9930: 73 20 74 68 65 20 50 4f 53 49 58 20 76 65 72 73  s the POSIX vers
9940: 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ion that is.  **
9950: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 20   available, the 
9960: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
9970: 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e 20 65  ll often be an e
9980: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e 6f 74  mpty string. Not
9990: 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70 72 6f   a.  ** huge pro
99a0: 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63 74 6c  blem. Incorrectl
99b0: 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74 68 61  y concluding tha
99c0: 74 20 74 68 65 20 47 4e 55 20 76 65 72 73 69 6f  t the GNU versio
99d0: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 0a  n is available .
99e0: 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20    ** could lead 
99f0: 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20 74 68  to a segfault th
9a00: 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66 20 64  ough..  */.#if d
9a10: 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f 52 5f  efined(STRERROR_
9a20: 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64 65 66  R_CHAR_P) || def
9a30: 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55 29 0a  ined(__USE_GNU).
9a40: 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e 64 69    zErr = .# endi
9a50: 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72 28 69  f.  strerror_r(i
9a60: 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73 69 7a  Errno, aErr, siz
9a70: 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a 0a 23  eof(aErr)-1);..#
9a80: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  elif SQLITE_THRE
9a90: 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68 69 73  ADSAFE.  /* This
9aa0: 20 69 73 20 61 20 74 68 72 65 61 64 73 61 66 65   is a threadsafe
9ab0: 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74 72 65   build, but stre
9ac0: 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f 74 20  rror_r() is not 
9ad0: 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20  available. */.  
9ae0: 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c 73 65  zErr = "";.#else
9af0: 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65 61 64  .  /* Non-thread
9b00: 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73 65 20  safe build, use 
9b10: 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f 0a 20  strerror(). */. 
9b20: 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72 6f 72   zErr = strerror
9b30: 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66  (iErrno);.#endif
9b40: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ..  assert( errc
9b50: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
9b60: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
9b70: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
9b80: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
9b90: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
9ba0: 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64 29 20  unix.c:%d: (%d) 
9bb0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
9bc0: 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e      iLine, iErrn
9bd0: 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c  o, zFunc, zPath,
9be0: 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20 72 65   zErr.  );..  re
9bf0: 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a  turn errcode;.}.
9c00: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
9c10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a  ile descriptor..
9c20: 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
9c30: 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61 6c 6d  that close() alm
9c40: 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 73  ost always works
9c50: 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20 6f 6e  , since it is on
9c60: 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72 79 20  ly in a.** very 
9c70: 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69 6f 6e  sick application
9c80: 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20 73 69   or on a very si
9c90: 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74  ck platform that
9ca0: 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c 2e 0a   it might fail..
9cb0: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 66 61  ** If it does fa
9cc0: 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61 6b 20  il, simply leak 
9cd0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
9ce0: 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f 67 20  tor, but do log 
9cf0: 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a  the.** error..**
9d00: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74  .** Note that it
9d10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
9d20: 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20 61 66  retry close() af
9d30: 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63 65 20  ter EINTR since 
9d40: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  the.** file desc
9d50: 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68 61 76  riptor might hav
9d60: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
9d70: 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68 65 72  eused by another
9d80: 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f 20 77   thread..** So w
9d90: 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74 72 79  e don't even try
9da0: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
9db0: 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75 73 74   an EINTR.  Just
9dc0: 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72 0a 2a   log the error.*
9dd0: 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a  * and move on..*
9de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f  /.static void ro
9df0: 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69 78 46  bust_close(unixF
9e00: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
9e10: 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  h, int lineno){.
9e20: 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28 68 29    if( osClose(h)
9e30: 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45   ){.    unixLogE
9e40: 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c 49 54  rrorAtLine(SQLIT
9e50: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 22  E_IOERR_CLOSE, "
9e60: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20 20 20  close",.        
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9e80: 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e 7a 50  File ? pFile->zP
9e90: 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29  ath : 0, lineno)
9ea0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
9eb0: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65  lose all file de
9ec0: 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75  scriptors accumu
9ed0: 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78  ated in the unix
9ee0: 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73  InodeInfo->pUnus
9ef0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61  ed list..*/ .sta
9f00: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65  tic void closePe
9f10: 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c  ndingFds(unixFil
9f20: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
9f30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
9f40: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
9f50: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
9f60: 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75  Fd *p;.  UnixUnu
9f70: 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20  sedFd *pNext;.  
9f80: 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55  for(p=pInode->pU
9f90: 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78  nused; p; p=pNex
9fa0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
9fb0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 72 6f  p->pNext;.    ro
9fc0: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
9fd0: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
9fe0: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
9ff0: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
a000: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
a010: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
a020: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
a030: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
a040: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
a050: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
a060: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
a070: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
a080: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
a090: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
a0a0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
a0b0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
a0c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a0d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a0e0: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
a0f0: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
a100: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
a110: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
a120: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
a130: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
a140: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
a150: 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29  ALWAYS(pInode) )
a160: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  {.    pInode->nR
a170: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ef--;.    if( pI
a180: 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  node->nRef==0 ){
a190: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a1a0: 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d  Inode->pShmNode=
a1b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 );.      clos
a1c0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
a1d0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
a1e0: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20  node->pPrev ){. 
a1f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a200: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a210: 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ext==pInode );. 
a220: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
a230: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49  Prev->pNext = pI
a240: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
a250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a260: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
a270: 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ist==pInode );. 
a280: 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74         inodeList
a290: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
a2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2b0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  if( pInode->pNex
a2c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
a2d0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  ert( pInode->pNe
a2e0: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64  xt->pPrev==pInod
a2f0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
a300: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a310: 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  v = pInode->pPre
a320: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
a330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
a340: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
a350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
a360: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
a370: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
a380: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
a390: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
a3a0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
a3b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
a3c0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
a3d0: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
a3e0: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
a3f0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
a400: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
a410: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
a420: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
a430: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
a440: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
a450: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
a460: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
a470: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
a480: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
a490: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
a4a0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
a4b0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
a4c0: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
a4d0: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
a4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
a4f0: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
a500: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
a510: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
a520: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
a530: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
a540: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
a550: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
a560: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
a570: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
a590: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
a5a0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
a5b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a5d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
a5e0: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
a5f0: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
a600: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
a610: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
a620: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a630: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
a640: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
a650: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
a660: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
a670: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
a680: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
a690: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
a6a0: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
a6b0: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
a6c0: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
a6d0: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
a6e0: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
a6f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
a700: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
a710: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
a720: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
a730: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
a740: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
a750: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
a760: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
a770: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
a780: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  rc!=0 ){.    pFi
a790: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
a7a0: 65 72 72 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f  errno;.#ifdef EO
a7b0: 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20  VERFLOW.    if( 
a7c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
a7d0: 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65  ==EOVERFLOW ) re
a7e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  turn SQLITE_NOLF
a7f0: 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  S;.#endif.    re
a800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
a810: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  R;.  }..#ifdef _
a820: 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e  _APPLE__.  /* On
a830: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
a840: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
a850: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
a860: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
a870: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
a880: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
a890: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
a8a0: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
a8b0: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
a8c0: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
a8d0: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
a8e0: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
a8f0: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
a900: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
a910: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
a920: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
a930: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
a940: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
a950: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
a960: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
a970: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
a980: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
a990: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
a9a0: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
a9b0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
a9c0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
a9d0: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
a9e0: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
a9f0: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
aa00: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
aa10: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
aa20: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
aa30: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
aa40: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
aa50: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
aa60: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
aa70: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
aa80: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
aa90: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26  uf.st_size==0 &&
aaa0: 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73   (pFile->fsFlags
aab0: 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47   & SQLITE_FSFLAG
aac0: 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29  S_IS_MSDOS)!=0 )
aad0: 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f  {.    do{ rc = o
aae0: 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20  sWrite(fd, "S", 
aaf0: 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  1); }while( rc<0
ab00: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
ab10: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
ab20: 31 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  1 ){.      pFile
ab30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
ab40: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
ab50: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
ab60: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
ab70: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
ab80: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
ab90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  !=0 ){.      pFi
aba0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
abb0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  errno;.      ret
abc0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
abd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
abe0: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
abf0: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
ac00: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
ac10: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
ac20: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
ac30: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
ac40: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
ac50: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
ac60: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
ac70: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
ac80: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
ac90: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
aca0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
acb0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
acc0: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
acd0: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
ace0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
acf0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
ad00: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
ad10: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
ad20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
ad30: 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20  of(*pInode) );. 
ad40: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30     if( pInode==0
ad50: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ad60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ad70: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
ad80: 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f  pInode, 0, sizeo
ad90: 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20  f(*pInode));.   
ada0: 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d   memcpy(&pInode-
adb0: 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64  >fileId, &fileId
adc0: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
add0: 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  );.    pInode->n
ade0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e  Ref = 1;.    pIn
adf0: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f  ode->pNext = ino
ae00: 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f  deList;.    pIno
ae10: 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  de->pPrev = 0;. 
ae20: 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74     if( inodeList
ae30: 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50   ) inodeList->pP
ae40: 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  rev = pInode;.  
ae50: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
ae60: 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  node;.  }else{. 
ae70: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b     pInode->nRef+
ae80: 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64  +;.  }.  *ppInod
ae90: 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65  e = pInode;.  re
aea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
aeb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
aec0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
aed0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
aee0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
aef0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
af00: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
af10: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
af20: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
af30: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
af40: 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
af50: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
af60: 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
af70: 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
af80: 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
af90: 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
afa0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
afb0: 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
afc0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
afd0: 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
afe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
aff0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
b000: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
b010: 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
b020: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
b030: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
b040: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
b050: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
b060: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
b070: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
b080: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
b090: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b0a0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
b0b0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
b0c0: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
b0d0: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
b0e0: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
b0f0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
b100: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
b110: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
b120: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
b130: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
b140: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
b150: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
b160: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
b170: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
b180: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
b190: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
b1a0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
b1b0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
b1c0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
b1d0: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
b1e0: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
b1f0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
b200: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
b210: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
b220: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
b230: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
b240: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b250: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
b260: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
b270: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
b280: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
b290: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
b2a0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
b2b0: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  LK, &lock) ){.  
b2c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b2d0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b2e0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  VEDLOCK;.      p
b2f0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
b300: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65  = errno;.    } e
b310: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
b320: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
b330: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
b340: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
b350: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
b360: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
b370: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
b380: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
b390: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
b3a0: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
b3b0: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
b3c0: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
b3d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b3e0: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
b3f0: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
b400: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
b410: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
b420: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
b430: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
b440: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
b450: 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66  ned read/write f
b460: 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74  rom unix-excl, t
b470: 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63  hen the only loc
b480: 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e  k.** ever obtain
b490: 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69  ed is an exclusi
b4a0: 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20  ve lock, and it 
b4b0: 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63  is obtained exac
b4c0: 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  tly once.** the 
b4d0: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
b4e0: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
b4f0: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
b500: 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67  t system locking
b510: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62  .** operations b
b520: 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c  ecome no-ops.  L
b530: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
b540: 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  s still happen i
b550: 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e  nternally,.** in
b560: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69   order to coordi
b570: 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77  nate access betw
b580: 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74  een separate dat
b590: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b5a0: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  s.** within this
b5b0: 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c   process, but al
b5c0: 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e  l of that is han
b5d0: 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61  dled in memory a
b5e0: 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  nd the.** operat
b5f0: 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ing system does 
b600: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e  not participate.
b610: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
b620: 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74  tion is a pass-t
b630: 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28  hrough to fcntl(
b640: 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c  F_SETLK) if pFil
b650: 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e  e is using.** an
b660: 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e  y VFS other than
b670: 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20   "unix-excl" or 
b680: 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e  if pFile is open
b690: 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c  ed on "unix-excl
b6a0: 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  ".** and is read
b6b0: 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  -only..**.** Zer
b6c0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
b6d0: 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65   the call comple
b6e0: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
b6f0: 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c  , or -1 if a cal
b700: 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20  l.** to fcntl() 
b710: 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  fails. In this c
b720: 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65  ase, errno is se
b730: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20  t appropriately 
b740: 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f  (by fcntl())..*/
b750: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
b760: 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  FileLock(unixFil
b770: 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74  e *pFile, struct
b780: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a   flock *pLock){.
b790: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
b7a0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
b7b0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
b7c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
b7d0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
b7e0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
b7f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70  !=0 );.  if( ((p
b800: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b810: 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29  & UNIXFILE_EXCL)
b820: 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62  !=0 || pInode->b
b830: 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20  ProcessLock).   
b840: 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  && ((pFile->ctrl
b850: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
b860: 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29  _RDONLY)==0).  )
b870: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
b880: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
b890: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
b8a0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b8b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
b8c0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
b8d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
b8e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
b8f0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
b900: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
b910: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
b920: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
b930: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
b940: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
b950: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
b960: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
b970: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
b980: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
b990: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
b9a0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
b9b0: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
b9c0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
b9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b9e0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
b9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
ba00: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
ba10: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
ba20: 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
ba30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
ba40: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
ba50: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
ba60: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
ba70: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
ba80: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
ba90: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
baa0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
bab0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
bac0: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
bad0: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
bae0: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
baf0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
bb00: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
bb10: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
bb20: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
bb30: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
bb40: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
bb50: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
bb60: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
bb70: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
bb80: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
bb90: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
bba0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
bbb0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
bbc0: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
bbd0: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
bbe0: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
bbf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
bc00: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
bc10: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
bc20: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
bc30: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
bc40: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
bc50: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
bc60: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
bc70: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
bc80: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
bc90: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
bca0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
bcb0: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
bcc0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
bcd0: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
bce0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
bcf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
bd00: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
bd10: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
bd20: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
bd30: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
bd40: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
bd50: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
bd60: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
bd70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
bd80: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
bd90: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
bda0: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
bdb0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
bdc0: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
bdd0: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
bde0: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
bdf0: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
be00: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
be10: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
be20: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
be30: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
be40: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
be50: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
be60: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
be70: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
be80: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
be90: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
bea0: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
beb0: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
bec0: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
bed0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
bee0: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
bef0: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
bf00: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
bf10: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
bf20: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
bf30: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
bf40: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
bf50: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
bf60: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
bf70: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
bf80: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
bf90: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
bfa0: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
bfb0: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
bfc0: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
bfd0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
bfe0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
bff0: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
c000: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
c010: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
c020: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
c030: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
c040: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
c050: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
c060: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
c070: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
c080: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
c090: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
c0a0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
c0b0: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
c0c0: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
c0d0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
c0e0: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
c0f0: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
c100: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
c110: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
c120: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
c130: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
c140: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
c150: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
c160: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
c170: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
c180: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
c190: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
c1a0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
c1b0: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
c1c0: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
c1d0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
c1e0: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
c1f0: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
c200: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c210: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c220: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
c230: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
c240: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
c250: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
c260: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
c270: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
c280: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
c290: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
c2a0: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
c2b0: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
c2c0: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
c2d0: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
c2e0: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
c2f0: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
c300: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
c310: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
c320: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
c330: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
c340: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
c350: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
c360: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
c370: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
c380: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
c390: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
c3a0: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
c3b0: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
c3c0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
c3d0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
c3e0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
c3f0: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
c400: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
c410: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
c420: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
c430: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
c440: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
c450: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
c460: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
c470: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
c480: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
c490: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
c4a0: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
c4b0: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
c4c0: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
c4d0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
c4e0: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
c4f0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c500: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
c510: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
c520: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
c530: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
c540: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
c550: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
c560: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
c570: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
c580: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
c590: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
c5a0: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
c5b0: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
c5c0: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
c5d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c5e0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
c5f0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c600: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
c610: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
c620: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
c630: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
c640: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
c650: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
c660: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
c670: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
c680: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
c690: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
c6a0: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
c6b0: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
c6c0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
c6d0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
c6e0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
c6f0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
c700: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
c710: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
c720: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
c730: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
c740: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
c750: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
c760: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
c770: 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46  n the.  ** unixF
c780: 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
c790: 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
c7a0: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
c7b0: 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
c7c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
c7d0: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
c7e0: 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
c7f0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
c800: 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
c810: 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
c820: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
c830: 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e  lready held) (un
c840: 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
c850: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  ,.            az
c860: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
c870: 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
c880: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c890: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
c8a0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
c8b0: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
c8c0: 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  ..  **  (1) We n
c8d0: 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
c8e0: 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
c8f0: 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
c900: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
c910: 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
c920: 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
c930: 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
c940: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
c950: 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
c960: 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
c970: 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
c980: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
c990: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
c9a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
c9b0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
c9c0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c9d0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c9e0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
c9f0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
ca00: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
ca10: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
ca20: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ca30: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
ca40: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74  ;..  /* This mut
ca50: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
ca60: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
ca70: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
ca80: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
ca90: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
caa0: 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
cab0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
cac0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
cad0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
cae0: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
caf0: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
cb00: 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
cb10: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
cb20: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
cb30: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
cb40: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
cb50: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
cb60: 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
cb70: 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20  ock && .        
cb80: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
cb90: 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
cba0: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e  CK || eFileLock>
cbb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
cbc0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
cbd0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
cbe0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
cbf0: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
cc00: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
cc10: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
cc20: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
cc30: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
cc40: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
cc50: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
cc60: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
cc70: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
cc80: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
cc90: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
cca0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
ccb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
ccc0: 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e  .      (pInode->
ccd0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
cce0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
ccf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ->eFileLock==RES
cd00: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  ERVED_LOCK) ){. 
cd10: 20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65     assert( eFile
cd20: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
cd30: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
cd40: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cd50: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
cd60: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
cd70: 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  red>0 );.    pFi
cd80: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
cd90: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
cda0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
cdb0: 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ++;.    pInode->
cdc0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
cdd0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
cde0: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
cdf0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
ce00: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
ce10: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
ce20: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
ce30: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
ce40: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
ce50: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
ce60: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
ce70: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
ce80: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  sed..  */.  lock
ce90: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c  .l_len = 1L;.  l
cea0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ceb0: 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65  EEK_SET;.  if( e
cec0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
ced0: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
cee0: 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  (eFileLock==EXCL
cef0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
cf00: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50  ile->eFileLock<P
cf10: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
cf20: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
cf30: 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d  e = (eFileLock==
cf40: 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44  SHARED_LOCK?F_RD
cf50: 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20  LCK:F_WRLCK);.  
cf60: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
cf70: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
cf80: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
cf90: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
cfa0: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
cfb0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
cfc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
cfd0: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
cfe0: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
cff0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
d000: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d010: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d020: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d030: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d040: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
d050: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
d060: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e   }...  /* If con
d070: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
d080: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
d090: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
d0a0: 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
d0b0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
d0c0: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
d0d0: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
d0e0: 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
d0f0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
d100: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
d110: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
d120: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d130: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d140: 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  k==0 );.    asse
d150: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
d160: 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  K );..    /* Now
d170: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
d180: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
d190: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
d1a0: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
d1b0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
d1c0: 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  IZE;.    if( uni
d1d0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
d1e0: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
d1f0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
d200: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d210: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
d220: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
d230: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
d240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d250: 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61  Drop the tempora
d260: 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20  ry PENDING lock 
d270: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
d280: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
d290: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
d2a0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63  en = 1L;.    loc
d2b0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
d2c0: 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  CK;.    if( unix
d2d0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
d2e0: 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51  &lock) && rc==SQ
d2f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d300: 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68   /* This could h
d310: 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74  appen with a net
d320: 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20  work mount */.  
d330: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
d340: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
d350: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
d360: 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK; .    }..    
d370: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d390: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
d3a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d3b0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d3c0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d3d0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
d3e0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
d3f0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
d400: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
d410: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
d420: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
d430: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
d440: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
d450: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
d460: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
d470: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
d480: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
d490: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
d4a0: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
d4b0: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
d4c0: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
d4d0: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
d4e0: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
d4f0: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
d500: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
d510: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
d520: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
d530: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
d540: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
d550: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
d560: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
d570: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
d580: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
d590: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
d5a0: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
d5b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
d5c0: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
d5d0: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
d5e0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
d5f0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
d600: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
d610: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
d620: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
d630: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
d640: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
d650: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
d660: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
d670: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
d680: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
d690: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
d6a0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
d6b0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
d6c0: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
d6d0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
d6e0: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
d6f0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
d700: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
d710: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
d720: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
d730: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
d740: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
d750: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
d760: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
d770: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
d780: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  Y ){.        pFi
d790: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d7a0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
d7b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
d7c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d7d0: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
d7e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
d7f0: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
d800: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
d810: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
d820: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
d830: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
d840: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
d850: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
d860: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
d870: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
d880: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
d890: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
d8a0: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
d8b0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
d8c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
d8d0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
d8e0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d8f0: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
d900: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
d910: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
d920: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
d930: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
d940: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
d950: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
d960: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
d970: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
d980: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
d990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d9a0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
d9b0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
d9c0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
d9d0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
d9e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
d9f0: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
da00: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
da10: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
da20: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
da30: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
da40: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
da50: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
da60: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
da70: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
da80: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
da90: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
daa0: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
dab0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
dac0: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
dad0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
dae0: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
daf0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
db00: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
db10: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
db20: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
db30: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
db40: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
db50: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
db60: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
db70: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
db80: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
db90: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
dba0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
dbb0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
dbc0: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  p = pFile->pUnus
dbd0: 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ed;.  p->pNext =
dbe0: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
dbf0: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
dc00: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
dc10: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
dc20: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
dc30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
dc40: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
dc50: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
dc60: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
dc70: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
dc80: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
dc90: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
dca0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
dcb0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
dcc0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
dcd0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
dce0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
dcf0: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
dd00: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
dd10: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
dd20: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
dd30: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
dd40: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
dd50: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
dd60: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
dd70: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
dd80: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
dd90: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
dda0: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
ddb0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
ddc0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
ddd0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
dde0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
ddf0: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
de00: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
de10: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
de20: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
de30: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
de40: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
de50: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
de60: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
de70: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
de80: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
de90: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
dea0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
deb0: 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  int posixUnlock(
dec0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
ded0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c  , int eFileLock,
dee0: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
def0: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
df00: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
df10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
df20: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
df30: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
df40: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
df50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
df60: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
df70: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
df80: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
df90: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
dfa0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
dfb0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
dfc0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
dfd0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
dfe0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
dff0: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
e000: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
e010: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
e020: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
e030: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
e040: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
e050: 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
e060: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
e070: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e080: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
e090: 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
e0a0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
e0b0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
e0c0: 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
e0d0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e0e0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
e0f0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
e100: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
e110: 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
e120: 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20  Lock );..#ifdef 
e130: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
e140: 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
e150: 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
e160: 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
e170: 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
e180: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
e190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
e1a0: 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
e1b0: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
e1c0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
e1d0: 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
e1e0: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
e1f0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
e200: 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
e210: 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
e220: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
e230: 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
e240: 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
e250: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
e260: 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
e270: 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
e280: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
e290: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
e2a0: 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
e2b0: 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
e2c0: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
e2d0: 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
e2e0: 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
e2f0: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
e300: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
e310: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
e320: 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
e330: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
e340: 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
e350: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
e360: 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
e370: 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
e380: 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
e390: 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
e3a0: 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
e3b0: 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
e3c0: 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
e3d0: 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
e3e0: 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
e3f0: 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
e400: 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
e410: 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
e420: 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
e430: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
e440: 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
e450: 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
e460: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
e470: 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
e480: 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
e490: 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
e4a0: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
e4b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e4c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e4d0: 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23 69 66 20 21  D_LOCK ){..#if !
e4e0: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
e4f0: 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e  _) || !SQLITE_EN
e500: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
e510: 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68  LE.      (void)h
e520: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a  andleNFSUnlock;.
e530: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
e540: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30  ndleNFSUnlock==0
e550: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   );.#endif.#if d
e560: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
e570: 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
e580: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
e590: 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c  .      if( handl
e5a0: 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20  eNFSUnlock ){.  
e5b0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
e5c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e5d0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
e5e0: 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65  om system call e
e5f0: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  rrors */.       
e600: 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d   off_t divSize =
e610: 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31   SHARED_SIZE - 1
e620: 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
e630: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
e640: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
e650: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
e660: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
e670: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e680: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
e690: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
e6a0: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
e6b0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
e6c0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e6d0: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
e6e0: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
e6f0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
e700: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e710: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
e720: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
e730: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
e740: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
e750: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
e760: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
e770: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
e780: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e7a0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e7b0: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
e7c0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e7d0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
e7e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e7f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
e800: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e810: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
e820: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
e830: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
e840: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
e850: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
e860: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
e870: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e880: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e890: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e8a0: 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_RDLOCK);.   
e8b0: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
e8c0: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
e8e0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
e8f0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  Errno;.         
e900: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
e910: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
e920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e930: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e940: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
e950: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
e960: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
e970: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e980: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76  SHARED_FIRST+div
e990: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f  Size;.        lo
e9a0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
e9b0: 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a  D_SIZE-divSize;.
e9c0: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
e9d0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e9e0: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
e9f0: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
ea00: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ea10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ea20: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
ea30: 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
ea40: 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
ea50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
ea60: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ea70: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
ea80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
ea90: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
eaa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eab0: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64  else.#endif /* d
eac0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
ead0: 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
eae0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
eaf0: 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
eb00: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
eb10: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
eb20: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
eb30: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
eb40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
eb50: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
eb60: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
eb70: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
eb80: 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ZE;.        if( 
eb90: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
eba0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
ebb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
ebc0: 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74  eory, the call t
ebd0: 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29  o unixFileLock()
ebe0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63   cannot fail bec
ebf0: 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  ause another.   
ec00: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
ec10: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  s is holding an 
ec20: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63  incompatible loc
ec30: 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  k. If it does, t
ec40: 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
ec50: 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  * indicates that
ec60: 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65   the other proce
ec70: 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
ec80: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  ing the locking.
ec90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
eca0: 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68  tocol. If this h
ecb0: 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53  appens, return S
ecc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
ecd0: 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20  CK. Returning.  
ece0: 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
ecf0: 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e  E_BUSY would con
ed00: 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c  fuse the upper l
ed10: 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63  ayer (in practic
ed20: 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20  e it causes .   
ed30: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73         ** an ass
ed40: 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f  ert to fail). */
ed50: 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
ed60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
ed70: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
ed80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ed90: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
eda0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
edb0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
edc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
edd0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ede0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
edf0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ee00: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
ee10: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
ee20: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
ee30: 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73  l_len = 2L;  ass
ee40: 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54  ert( PENDING_BYT
ee50: 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59  E+1==RESERVED_BY
ee60: 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e  TE );.    if( un
ee70: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
ee80: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
ee90: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
eea0: 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
eeb0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
eec0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
eed0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
eee0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
eef0: 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
ef00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
ef10: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  unlock;.    }.  
ef20: 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  }.  if( eFileLoc
ef30: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k==NO_LOCK ){.  
ef40: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
ef50: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
ef60: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
ef70: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
ef80: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
ef90: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
efa0: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
efb0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
efc0: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
efd0: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
efe0: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
eff0: 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
f000: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
f010: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  d==0 ){.      lo
f020: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f030: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
f040: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f050: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
f060: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
f070: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
f080: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f090: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
f0a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
f0b0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f0c0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
f0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f0f0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
f100: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
f110: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f120: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
f130: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
f140: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
f150: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f160: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
f170: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
f180: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
f190: 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
f1a0: 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
f1b0: 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
f1c0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
f1d0: 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
f1e0: 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
f1f0: 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
f200: 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
f210: 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
f220: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
f230: 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
f240: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
f250: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
f260: 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
f270: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
f280: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
f290: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
f2a0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  s(pFile);.    }.
f2b0: 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a    }..end_unlock:
f2c0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
f2d0: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
f2e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
f2f0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f300: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
f310: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
f320: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
f330: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
f340: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
f350: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
f360: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
f370: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
f380: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
f390: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
f3a0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
f3b0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
f3c0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
f3d0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
f3e0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
f3f0: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
f400: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
f410: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
f420: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71  nt unixUnlock(sq
f430: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f440: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
f450: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
f460: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
f470: 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a   || ((unixFile *
f480: 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  )id)->nFetchOut=
f490: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
f4a0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
f4b0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
f4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
f4d0: 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
f4e0: 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
f4f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
f500: 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
f510: 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 0a 2f 2a  xFile *pFd);../*
f520: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f530: 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
f540: 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
f550: 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
f560: 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
f570: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
f580: 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
f590: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
f5a0: 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
f5b0: 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
f5c0: 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
f5d0: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
f5e0: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
f5f0: 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
f600: 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
f610: 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
f620: 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
f630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f640: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
f650: 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
f660: 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
f670: 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
f680: 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
f690: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
f6a0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
f6b0: 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
f6c0: 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
f6d0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
f6e0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
f6f0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
f700: 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  nixUnmapfile(pFi
f710: 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
f720: 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
f730: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
f740: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
f750: 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
f760: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
f770: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
f780: 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
f790: 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
f7a0: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
f7b0: 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
f7c0: 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
f7d0: 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
f7e0: 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
f7f0: 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
f800: 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
f810: 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
f820: 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
f830: 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
f840: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
f850: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
f860: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
f870: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
f880: 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29  (pFile->pUnused)
f890: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
f8a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
f8b0: 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
f8c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f8d0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
f8e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f8f0: 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
f900: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
f910: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f920: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
f930: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f940: 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 55 6e  e *)id;.  unixUn
f950: 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
f960: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
f970: 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69  tex();..  /* uni
f980: 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
f990: 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
f9a0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
f9b0: 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
f9c0: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
f9d0: 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
f9e0: 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
f9f0: 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
fa00: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
fa10: 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
fa20: 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
fa30: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
fa40: 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
fa50: 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
fa60: 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
fa70: 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
fa80: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
fa90: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
faa0: 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
fab0: 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
fac0: 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
fad0: 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
fae0: 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
faf0: 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
fb00: 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
fb10: 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
fb20: 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
fb30: 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
fb40: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
fb50: 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
fb60: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
fb70: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
fb80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
fb90: 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
fba0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
fbb0: 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
fbc0: 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
fbd0: 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
fbe0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
fbf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fc00: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
fc10: 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
fc20: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
fc30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
fc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
fc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
fca0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
fcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcf0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
fd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
fd10: 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
fd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd40: 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
fd50: 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
fd60: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
fd70: 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
fd80: 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
fd90: 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
fda0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
fdb0: 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
fdc0: 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
fdd0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
fde0: 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
fdf0: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
fe00: 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
fe10: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
fe20: 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
fe30: 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
fe40: 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
fe50: 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
fe60: 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
fe70: 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
fe80: 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
fe90: 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
fea0: 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
feb0: 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
fec0: 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
fed0: 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
fee0: 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
fef0: 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
ff00: 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
ff10: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ff20: 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
ff30: 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
ff40: 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
ff50: 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
ff60: 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
ff70: 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
ff80: 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
ff90: 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
ffa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
ffb0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
ffc0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
ffd0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
ffe0: 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
fff0: 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
10000 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
10010 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
10020 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
10030 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
10040 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
10050 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
10060 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
10070 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
10080 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
10090 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
100a0 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
100b0 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
100c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
100d0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
100e0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
100f0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
10100 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
10110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10120 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
10130 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
10140 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10150 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10160 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10170 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10180 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
101a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
101b0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
101c0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
101d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
101e0 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73   {.  return clos
101f0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
10200 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10210 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
10220 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
10230 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
10240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10250 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102a0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
10310 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
10320 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10340 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
10350 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
10360 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
10370 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
10380 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
10390 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
103a0 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
103b0 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
103c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
103d0 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
103e0 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
103f0 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
10400 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
10410 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
10420 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
10430 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
10440 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
10450 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
10460 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
10470 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
10480 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
10490 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
104a0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
104b0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
104c0 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
104d0 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
104e0 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
104f0 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
10500 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
10510 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
10520 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
10530 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
10540 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
10550 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
10560 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
10570 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
10580 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
10590 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
105a0 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
105b0 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
105c0 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
105d0 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
105e0 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
105f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
10600 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10610 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
10620 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
10630 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
10640 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
10650 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
10660 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
10670 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
10680 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
10690 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
106a0 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
106b0 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
106c0 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
106d0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
106e0 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
106f0 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
10700 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
10710 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
10720 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
10730 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
10740 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
10750 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
10760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10770 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
10780 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
10790 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
107a0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
107b0 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
107c0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
107d0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
107e0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
107f0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
10800 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
10810 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
10820 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
10830 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
10840 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
10850 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
10860 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
10870 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
10880 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
10890 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
108a0 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
108b0 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
108c0 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
108d0 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
108e0 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
108f0 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
10900 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
10910 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
10920 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
10930 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
10940 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
10950 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
10960 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10970 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10980 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10990 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
109a0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
109b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
109c0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
109d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
109e0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
109f0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
10a00 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10a10 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10a20 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10a30 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10a40 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
10a50 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
10a60 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
10a70 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
10a80 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
10a90 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
10aa0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
10ab0 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
10ac0 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
10ad0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
10ae0 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
10af0 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
10b00 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
10b10 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
10b20 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
10b30 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
10b40 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
10b50 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
10b60 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
10b70 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
10b80 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
10b90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
10ba0 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
10bb0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
10bc0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
10bd0 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65  eserved = osAcce
10be0 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
10bf0 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
10c00 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
10c10 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
10c20 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10c30 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
10c40 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
10c50 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
10c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10c70 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
10c80 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
10c90 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
10ca0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
10cb0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
10cc0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
10cd0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
10ce0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
10cf0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
10d00 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
10d10 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
10d20 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
10d30 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
10d40 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
10d50 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
10d60 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
10d70 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
10d80 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
10d90 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
10da0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
10db0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
10dc0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
10dd0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
10de0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
10df0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
10e00 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
10e10 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
10e20 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
10e30 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
10e40 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
10e50 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
10e60 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
10e70 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
10e80 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
10e90 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
10ea0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
10eb0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
10ec0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
10ed0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
10ee0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
10ef0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
10f00 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
10f10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
10f20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10f30 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
10f40 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
10f50 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
10f60 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
10f70 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
10f80 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
10f90 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
10fa0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
10fb0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
10fc0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
10fd0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
10fe0 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
10ff0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11000 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11010 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11020 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11030 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11040 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11050 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11060 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11070 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
11080 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
11090 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
110a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
110b0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
110c0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
110d0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
110e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
110f0 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11100 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11110 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11120 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11130 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11140 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11150 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11160 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11170 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11180 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
11190 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
111a0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
111b0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
111c0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
111d0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
111e0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
111f0 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11200 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11210 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11230 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11240 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11250 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11260 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11270 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
11280 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
11290 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
112a0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
112b0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
112c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
112d0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
112e0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
112f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11300 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11310 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11320 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11330 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11340 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
11350 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11360 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11370 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11380 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
11390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
113a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
113b0 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
113c0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
113d0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
113e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
113f0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
11400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11410 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
11420 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
11430 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
11440 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
11450 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
11460 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
11470 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
11480 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
11490 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
114a0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
114b0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
114c0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
114d0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
114e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
114f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11500 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
11510 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
11520 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
11530 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
11540 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
11550 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
11560 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
11570 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
11580 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
11590 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
115a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
115b0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
115c0 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
115d0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
115e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
115f0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11600 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
11610 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
11620 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
11630 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
11640 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
11650 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
11660 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29  leLock, getpid()
11670 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
11680 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
11690 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
116a0 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
116b0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
116c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
116d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
116e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
116f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77    }..  /* To dow
11700 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64  ngrade to shared
11710 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20  , simply update 
11720 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74  our internal not
11730 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
11740 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20  lock state.  No 
11750 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74  need to mess wit
11760 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  h the file on di
11770 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  sk..  */.  if( e
11780 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
11790 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
117a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
117b0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
117c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
117d0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  K;.  }.  .  /* T
117e0 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74  o fully unlock t
117f0 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c  he database, del
11800 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
11810 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  e */.  assert( e
11820 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
11830 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d  K );.  rc = osRm
11840 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a  dir(zLockFile);.
11850 20 20 69 66 28 20 72 63 3c 30 20 26 26 20 65 72    if( rc<0 && er
11860 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29 20 72  rno==ENOTDIR ) r
11870 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f  c = osUnlink(zLo
11880 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  ckFile);.  if( r
11890 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  c<0 ){.    int t
118a0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
118b0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69     rc = 0;.    i
118c0 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72  f( ENOENT != tEr
118d0 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rno ){.      rc 
118e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
118f0 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  NLOCK;.    }.   
11900 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
11910 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
11920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11930 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
11940 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
11950 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
11960 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11970 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
11980 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11990 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
119a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
119b0 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
119c0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
119d0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
119e0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
119f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11a00 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
11a10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
11a20 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
11a30 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
11a40 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
11a50 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
11a60 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
11a70 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
11a80 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11a90 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
11aa0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
11ab0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11ac0 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
11ad0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
11ae0 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
11af0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b60 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
11b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bb0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
11bd0 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
11be0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
11c10 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
11c20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
11c30 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
11c40 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
11c50 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
11c60 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
11c70 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
11c80 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
11c90 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
11ca0 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
11cb0 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
11cc0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
11cd0 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
11ce0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
11cf0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
11d00 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
11d10 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
11d20 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
11d30 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
11d40 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
11d50 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
11d60 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
11d70 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
11d80 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
11d90 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
11da0 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
11db0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
11dc0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
11dd0 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
11de0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11df0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
11e00 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69   turned off or i
11e10 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66  f.** compiling f
11e20 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23  or VXWORKS..*/.#
11e30 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
11e40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
11e50 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  & !OS_VXWORKS../
11e60 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
11e70 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
11e80 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
11e90 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
11ea0 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
11eb0 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
11ec0 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
11ed0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
11ee0 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
11ef0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
11f00 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
11f10 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
11f20 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
11f30 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
11f40 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
11f50 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
11f60 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
11f70 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
11f80 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
11f90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
11fa0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
11fb0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
11fc0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
11fd0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
11fe0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
11ff0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
12000 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
12010 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
12020 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
12030 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
12040 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
12050 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
12060 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
12070 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
12080 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
12090 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
120a0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
120b0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
120c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
120d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
120e0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
120f0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12100 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12110 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
12120 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
12130 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
12140 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
12150 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
12160 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
12170 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
12180 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
12190 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
121a0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
121b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
121c0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
121d0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
121e0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
121f0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
12200 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
12210 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
12220 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
12230 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
12240 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
12250 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
12260 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12270 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
12280 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
12290 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
122a0 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
122b0 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
122c0 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
122d0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
122e0 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
122f0 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
12300 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
12310 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
12320 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
12330 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
12340 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d  */.        lrc =
12350 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12360 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 69  LOCK; .        i
12370 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
12380 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
12390 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
123a0 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
123b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
123c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
123d0 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
123e0 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
123f0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12400 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12410 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
12420 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
12430 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
12440 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
12450 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
12460 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
12470 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
12480 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
12490 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
124a0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
124b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
124c0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
124d0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
124e0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
124f0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
12500 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63  K %d %d %d (floc
12510 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
12520 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
12530 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12540 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
12550 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
12560 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
12570 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
12580 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
12590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65  QLITE_OK;.    re
125a0 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65  served=1;.  }.#e
125b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
125c0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
125d0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52  _ERRORS */.  *pR
125e0 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
125f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12600 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
12610 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
12620 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
12630 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
12640 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
12650 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
12660 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
12670 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
12680 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
12690 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
126a0 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
126b0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
126c0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
126d0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
126e0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
126f0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
12700 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
12710 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
12720 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
12730 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
12740 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
12750 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
12760 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
12770 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
12780 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
12790 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
127a0 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
127b0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
127c0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
127d0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
127e0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
127f0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
12800 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
12810 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
12820 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
12830 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
12840 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
12850 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
12860 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
12870 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
12880 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
12890 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
128a0 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
128b0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
128c0 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
128d0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
128e0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
128f0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
12900 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
12910 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
12920 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
12930 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
12940 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
12950 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
12960 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
12970 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
12980 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
12990 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
129a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
129b0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
129c0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
129d0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
129e0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
129f0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
12a00 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
12a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
12a20 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
12a30 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
12a40 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
12a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12a60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
12a70 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
12a80 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
12a90 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66  File );..  /* if
12aa0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
12ab0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
12ac0 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
12ad0 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
12ae0 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
12af0 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
12b00 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if (pFile->eFile
12b10 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  Lock > NO_LOCK) 
12b20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12b30 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
12b40 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
12b50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
12b60 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78  .  /* grab an ex
12b70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
12b80 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f    .  if (robust_
12b90 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12ba0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12bb0 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45  B)) {.    int tE
12bc0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12bd0 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c    /* didn't get,
12be0 20 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f   must be busy */
12bf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12c00 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12c10 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12c20 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
12c30 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
12c40 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
12c50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12c60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
12c70 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
12c80 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65     /* got it, se
12c90 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
12ca0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20  eturn ok */.    
12cb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12cc0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12cd0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  }.  OSTRACE(("LO
12ce0 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
12cf0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
12d00 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
12d10 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
12d20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
12d30 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
12d40 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65  failed"));.#ifde
12d50 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
12d60 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12d70 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
12d80 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
12d90 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
12db0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
12dc0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
12dd0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
12de0 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
12df0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
12e00 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
12e10 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
12e20 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
12e30 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
12e40 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
12e50 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
12e60 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
12e70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
12e80 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
12e90 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
12ea0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
12eb0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
12ec0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
12ed0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
12ee0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
12ef0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
12f00 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
12f10 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12f20 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
12f30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12f40 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12f50 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
12f60 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
12f70 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
12f80 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
12f90 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
12fa0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
12fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
12fc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67  le->eFileLock, g
12fd0 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73  etpid()));.  ass
12fe0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
12ff0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13000 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
13010 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
13020 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
13030 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
13040 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13050 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
13060 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
13070 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
13080 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
13090 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
130a0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
130b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
130c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
130d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
130e0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
130f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13100 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
13110 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
13120 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
13130 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
13140 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
13150 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13160 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
13170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13180 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
13190 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
131a0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
131b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
131c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
131d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
131e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
131f0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
13200 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13210 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
13220 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
13230 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
13240 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13250 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
13260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13270 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
13280 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13290 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  OCK);.    rc = c
132a0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
132b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
132c0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
132d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
132e0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
132f0 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
13300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13310 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
13320 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
13330 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
13340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
133a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
133f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13400 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
13410 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
13420 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
13430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13440 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
13450 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
13460 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
13470 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
13480 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
13490 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
134a0 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
134b0 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
134c0 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
134d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
134e0 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
134f0 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
13500 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
13510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13520 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
13530 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
13540 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
13550 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
13560 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
13570 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
13580 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
13590 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
135a0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
135b0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
135c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
135d0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
135e0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
135f0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
13600 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
13610 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
13620 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
13630 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
13640 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
13650 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
13660 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
13670 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
13680 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
13690 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
136a0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
136b0 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
136c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
136d0 73 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  semCheckReserved
136e0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
136f0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
13700 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
13710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13720 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
13730 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13740 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13750 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
13760 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
13770 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
13780 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
13790 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
137a0 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  File );..  /* Ch
137b0 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
137c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
137d0 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
137e0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
137f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
13800 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13810 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
13820 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
13830 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
13840 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
13850 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
13860 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
13870 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
13880 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
13890 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  em;.    struct s
138a0 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20 20  tat statBuf;..  
138b0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
138c0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
138d0 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
138e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
138f0 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
13900 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
13910 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13920 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13930 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13940 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13950 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  LOCK);.        p
13960 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13970 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
13980 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
13990 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
139a0 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
139b0 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
139c0 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
139d0 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
139e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
139f0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13a00 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13a10 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
13a20 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
13a30 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
13a40 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
13a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
13a60 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
13a70 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
13a80 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
13a90 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
13aa0 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
13ab0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
13ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
13ad0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
13ae0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
13af0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
13b00 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
13b10 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
13b20 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
13b30 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
13b40 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
13b50 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
13b60 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
13b70 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
13b80 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
13b90 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
13ba0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
13bb0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
13bc0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
13bd0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
13be0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
13bf0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
13c00 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
13c10 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
13c20 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
13c30 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
13c40 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
13c50 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
13c60 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
13c70 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
13c80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
13c90 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
13ca0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
13cb0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
13cc0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
13cd0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
13ce0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
13cf0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
13d00 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
13d10 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
13d20 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
13d30 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
13d40 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
13d50 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
13d60 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
13d70 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
13d80 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
13d90 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
13da0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
13db0 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
13dc0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
13dd0 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
13de0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
13df0 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
13e00 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
13e10 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
13e20 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
13e30 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
13e40 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
13e50 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
13e60 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
13e70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13e80 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
13e90 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
13ea0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
13eb0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
13ec0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
13ed0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
13ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
13ef0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13f00 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
13f10 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
13f20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
13f30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
13f40 20 66 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53   fd;.  sem_t *pS
13f50 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
13f60 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  de->pSem;.  int 
13f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13f80 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
13f90 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
13fa0 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
13fb0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
13fc0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
13fd0 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
13fe0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
13ff0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
14000 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
14010 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14020 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14040 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
14050 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
14060 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72  /* lock semaphor
14070 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f  e now but bail o
14080 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ut when already 
14090 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28  locked. */.  if(
140a0 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
140b0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63  m)==-1 ){.    rc
140c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
140d0 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
140e0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
140f0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
14100 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
14110 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
14120 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14130 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64  eLock;.. sem_end
14140 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20  _lock:.  return 
14150 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
14160 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
14170 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
14180 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
14190 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
141a0 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
141b0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
141c0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
141d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
141e0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
141f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
14200 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
14210 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
14220 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
14230 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
14240 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
14250 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
14260 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   semUnlock(sqlit
14270 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14280 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
14290 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
142a0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
142b0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
142c0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
142d0 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
142e0 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
142f0 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
14300 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
14310 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
14320 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
14330 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
14340 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
14350 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
14360 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
14370 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
14380 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
14390 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
143a0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
143b0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
143c0 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
143d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
143e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
143f0 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
14400 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
14410 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
14420 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
14430 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
14440 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
14450 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
14460 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
14470 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
14480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14490 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
144a0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
144b0 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
144c0 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
144d0 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
144e0 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
144f0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
14500 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
14510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
14520 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
14530 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
14540 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
14550 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72  >lastErrno = tEr
14560 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rno;.    }.    r
14570 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
14580 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14590 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
145a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
145b0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
145c0 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
145d0 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f 73 65  tic int semClose
145e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
145f0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
14600 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
14610 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14620 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55 6e 6c  *)id;.    semUnl
14630 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
14640 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
14650 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45  ile );.    unixE
14660 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
14670 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
14680 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e  o(pFile);.    un
14690 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
146a0 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c      closeUnixFil
146b0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
146c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
146d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
146e0 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20  XWORKS */./*.** 
146f0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
14700 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
14710 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57  available on VxW
14720 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  orks..**.*******
14730 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
14740 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68  the named semaph
14750 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ore lock impleme
14760 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
14770 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
14780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a  *******/.../****
147d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
147f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
14820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14830 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50  ****** Begin AFP
14840 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
14870 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c   AFP is the Appl
14880 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f  e Filing Protoco
14890 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74  l.  AFP is a net
148a0 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20  work filesystem 
148b0 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c  found.** on Appl
148c0 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70  e Macintosh comp
148d0 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39  uters - both OS9
148e0 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20   and OSX..**.** 
148f0 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c  Third-party impl
14900 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41  ementations of A
14910 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  FP are available
14920 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65  .  But this code
14930 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f   here.** only wo
14940 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a  rks on OSX..*/..
14950 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
14960 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
14970 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
14980 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  STYLE./*.** The 
14990 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
149a0 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
149b0 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
149c0 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
149d0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
149e0 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
149f0 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  text afpLockingC
14a00 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61  ontext;.struct a
14a10 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14a20 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65   {.  int reserve
14a30 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
14a40 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
14a50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
14a60 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f  the open file */
14a70 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
14a80 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
14a90 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
14aa0 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
14ab0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
14ac0 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
14ad0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
14ae0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
14af0 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
14b00 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
14b10 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
14b20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
14b30 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
14b40 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
14b50 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
14b60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14b70 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
14b80 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
14b90 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
14ba0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
14bb0 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
14bc0 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
14bd0 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
14be0 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
14bf0 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
14c20 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
14c30 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
14c40 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
14c50 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
14c60 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28  TL        _IOWR(
14c70 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
14c80 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
14c90 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  )../*.** This is
14ca0 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73   a utility for s
14cb0 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69  etting or cleari
14cc0 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c  ng a bit-range l
14cd0 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50  ock on an.** AFP
14ce0 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20   filesystem..** 
14cf0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
14d00 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c  E_OK on success,
14d10 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
14d20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
14d30 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63  ic int afpSetLoc
14d40 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  k(.  const char 
14d50 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  *path,          
14d60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
14d70 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
14d80 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64  cked or unlocked
14d90 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
14da0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
14db0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
14dc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
14dd0 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  path */.  unsign
14de0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
14df0 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  set,     /* Firs
14e00 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
14e10 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ked */.  unsigne
14e20 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
14e30 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  th,     /* Numbe
14e40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
14e50 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c  ck */.  int setL
14e60 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20  ockFlag         
14e70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
14e80 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c  o set lock.  Fal
14e90 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b  se to clear lock
14ea0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
14eb0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
14ec0 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a   pb;.  int err;.
14ed0 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c    .  pb.unLockFl
14ee0 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67  ag = setLockFlag
14ef0 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73   ? 0 : 1;.  pb.s
14f00 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b  tartEndFlag = 0;
14f10 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f  .  pb.offset = o
14f20 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67  ffset;.  pb.leng
14f30 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20  th = length; .  
14f40 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  pb.fd = pFile->h
14f50 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28  ;.  .  OSTRACE((
14f60 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d  "AFPSETLOCK [%s]
14f70 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e   for %d%s in ran
14f80 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
14f90 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
14fa0 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
14fb0 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64  pFile->h, (pb.fd
14fc0 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31  ==-1?"[testval-1
14fd0 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73  ]":""),.    offs
14fe0 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20  et, length));.  
14ff0 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68  err = fsctl(path
15000 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  , afpfsByteRange
15010 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c  Lock2FSCTL, &pb,
15020 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d   0);.  if ( err=
15030 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15040 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72  rc;.    int tErr
15050 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15060 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
15070 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
15080 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
15090 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
150a0 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c     path, tErrno,
150b0 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f   strerror(tErrno
150c0 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  )));.#ifdef SQLI
150d0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
150e0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63  CK_ERRORS.    rc
150f0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15100 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73  #else.    rc = s
15110 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
15120 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
15130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15140 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67       setLockFlag
15150 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   ? SQLITE_IOERR_
15160 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  LOCK : SQLITE_IO
15170 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e  ERR_UNLOCK);.#en
15180 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
15190 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
151a0 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20  RORS */.    if( 
151b0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
151c0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
151d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
151e0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
151f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
15200 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
15210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15220 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15230 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15240 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15250 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15260 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15270 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15280 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15290 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
152a0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
152b0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
152c0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
152d0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
152e0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
152f0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15300 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15310 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15320 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15330 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15340 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15350 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
15360 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15370 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15380 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
15390 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
153a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
153b0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
153c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
153d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
153e0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
153f0 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
15400 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15410 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
15420 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
15430 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
15440 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15450 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
15460 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15470 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
15480 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
15490 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
154a0 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
154b0 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
154c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
154d0 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
154e0 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
154f0 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
15500 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
15510 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20   threads */.  . 
15520 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
15530 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
15540 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
15550 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
15560 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
15570 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
15580 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
15590 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
155a0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
155b0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
155c0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
155d0 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28   it..   */.  if(
155e0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
155f0 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45    /* lock the RE
15600 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20  SERVED byte */. 
15610 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70     int lrc = afp
15620 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
15630 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
15640 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
15650 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53  ,1);  .    if( S
15660 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b  QLITE_OK==lrc ){
15670 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20  .      /* if we 
15680 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b  succeeded in tak
15690 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64  ing the reserved
156a0 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
156b0 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20   to restore.    
156c0 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
156d0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20  l state */.     
156e0 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
156f0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
15700 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
15710 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
15720 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
15730 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c     /* if we fail
15740 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f  ed to get the lo
15750 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20  ck then someone 
15760 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69  else must have i
15770 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72  t */.      reser
15780 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ved = 1;.    }. 
15790 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
157a0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
157b0 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d     rc=lrc;.    }
157c0 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
157d0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
157e0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
157f0 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61  LOCK %d %d %d (a
15800 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15810 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
15820 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20  ;.  .  *pResOut 
15830 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
15840 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15850 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
15860 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
15870 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
15880 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
15890 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
158a0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
158b0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
158c0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
158d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
158e0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
158f0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
15900 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
15910 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
15920 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
15930 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
15940 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
15950 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
15960 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
15970 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
15980 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
15990 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
159a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
159b0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
159c0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
159d0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
159e0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
159f0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
15a00 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
15a10 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
15a20 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
15a30 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
15a40 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
15a50 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
15a60 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
15a70 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
15a80 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
15a90 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
15aa0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
15ab0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
15ac0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
15ad0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15ae0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
15af0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
15b00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15b10 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
15b20 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
15b30 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
15b40 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
15b50 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
15b60 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
15b70 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f  static int afpLo
15b80 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15b90 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
15ba0 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
15bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
15bc0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
15bd0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
15be0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
15bf0 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
15c00 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b  Inode;.  afpLock
15c10 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
15c20 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
15c30 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
15c40 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
15c50 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  t;.  .  assert( 
15c60 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
15c70 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
15c80 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
15c90 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
15ca0 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
15cb0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
15cc0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
15cd0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
15ce0 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
15cf0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
15d00 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  k(pInode->eFileL
15d10 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53  ock), pInode->nS
15d20 68 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29  hared , getpid()
15d30 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
15d40 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
15d50 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
15d60 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
15d70 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
15d80 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
15d90 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
15da0 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
15db0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
15dc0 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
15dd0 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
15de0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
15df0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
15e00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
15e10 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
15e20 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
15e30 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
15e40 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22  y held) (afp)\n"
15e50 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
15e60 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
15e70 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
15e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
15ea0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
15eb0 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
15ec0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20  s correct.  **  
15ed0 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
15ee0 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
15ef0 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
15f00 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
15f10 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
15f20 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
15f30 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
15f40 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
15f50 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
15f60 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
15f70 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
15f80 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
15f90 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
15fa0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
15fb0 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
15fc0 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
15fd0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15fe0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
15ff0 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
16000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
16010 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
16020 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
16030 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16040 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16050 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
16060 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
16070 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
16080 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
16090 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
160a0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
160b0 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
160c0 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
160d0 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
160e0 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
160f0 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
16100 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
16110 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
16120 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
16130 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
16140 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
16150 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
16160 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
16170 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
16180 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65   .       (pInode
16190 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
161a0 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
161b0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
161c0 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
161d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
161e0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
161f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
16200 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
16210 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
16220 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
16230 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
16240 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
16250 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
16260 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
16270 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
16280 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
16290 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
162a0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
162b0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
162c0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
162d0 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65  .     (pInode->e
162e0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
162f0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
16300 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
16310 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
16320 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
16330 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16340 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16350 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16360 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16370 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
16380 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
16390 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
163a0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
163b0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
163c0 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
163d0 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
163e0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
163f0 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
16400 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
16410 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
16420 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
16430 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
16440 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
16450 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16460 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
16470 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
16480 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
16490 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
164a0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
164b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
164c0 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
164d0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
164e0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
164f0 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
16500 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
16510 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
16520 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
16530 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16540 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
16550 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
16560 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
16570 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
16580 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
16590 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
165a0 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
165b0 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
165c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
165d0 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
165e0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
165f0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
16600 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
16610 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
16620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
16630 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16640 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
16650 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
16660 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e  rno = 0;.    lon
16670 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20  g lk, mask;.    
16680 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
16690 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
166a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
166b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
166c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a  ==0 );.        .
166d0 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65      mask = (size
166e0 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c  of(long)==8) ? L
166f0 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30  ARGEST_INT64 : 0
16700 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f  x7fffffff;.    /
16710 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
16720 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c  ad-lock SHARED_L
16730 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f  OCK */.    /* no
16740 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c  te that the qual
16750 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f  ity of the rando
16760 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61  mness doesn't ma
16770 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a  tter that much *
16780 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f  /.    lk = rando
16790 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65  m(); .    pInode
167a0 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
167b0 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52  lk & mask)%(SHAR
167c0 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
167d0 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c    lrc1 = afpSetL
167e0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
167f0 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
16800 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
16810 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
16820 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
16830 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
16840 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
16850 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
16860 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
16880 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
16890 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
168a0 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
168b0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
168c0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
168d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
168e0 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
168f0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
16900 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
16910 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16920 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20   = lrc1Errno;.  
16930 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
16940 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16950 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16960 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
16970 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
16980 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
16990 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
169a0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
169b0 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
169c0 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
169d0 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
169e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
169f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16a00 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16a10 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
16a20 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
16a30 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
16a40 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
16a50 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16a60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
16a70 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
16a80 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
16a90 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
16aa0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16ab0 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
16ac0 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
16ad0 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
16ae0 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
16af0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
16b00 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
16b10 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
16b20 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
16b30 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
16b40 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
16b50 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
16b60 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
16b70 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
16b80 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
16b90 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
16ba0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
16bb0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
16bc0 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
16bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
16be0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16bf0 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
16c00 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
16c10 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
16c20 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
16c30 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
16c40 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
16c50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
16c70 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
16c80 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16c90 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
16ca0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
16cb0 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
16cc0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
16cd0 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
16ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16cf0 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
16d00 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
16d10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
16d20 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
16d30 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
16d40 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
16d50 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
16d60 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16d70 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
16d80 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
16d90 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
16da0 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
16db0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
16dc0 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
16dd0 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
16de0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16df0 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
16e00 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
16e10 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
16e20 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
16e50 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
16e60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
16e70 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
16e80 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
16e90 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
16ea0 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
16eb0 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
16ec0 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
16ed0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16ee0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16ef0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
16f00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
16f30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
16f40 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
16f50 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
16f60 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16f70 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16f90 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
16fa0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16fb0 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
16fc0 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
16fd0 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
16fe0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
16ff0 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17000 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17010 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17020 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17030 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17040 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
17050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
17060 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
17070 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
17080 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17090 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
170a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
170b0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
170c0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
170d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
170e0 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
170f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17100 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17110 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
17120 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
17130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17140 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17150 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17160 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
17170 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17180 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
17190 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
171a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
171b0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
171c0 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
171d0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
171e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
171f0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
17200 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
17210 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17220 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17230 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
17240 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17250 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
17260 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
17270 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
17280 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
17290 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
172a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
172b0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
172c0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
172d0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
172e0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
172f0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17300 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17310 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17330 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17340 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17350 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
17360 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
17370 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
17380 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
17390 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
173a0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
173b0 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
173c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
173d0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
173e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
173f0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17400 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17410 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17420 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
17430 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17440 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17450 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
17460 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
17470 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
17480 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
17490 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
174a0 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
174b0 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
174c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
174d0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
174e0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
174f0 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
17500 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
17510 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17520 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17530 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17540 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
17550 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
17560 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
17570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74  ,.           get
17580 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
17590 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
175a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
175b0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
175c0 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
175d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
175e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
175f0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
17600 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
17610 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
17620 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
17630 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
17640 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17650 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
17660 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
17670 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
17680 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17690 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65   );.    Simulate
176a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
176b0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
176c0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
176d0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
176e0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
176f0 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
17700 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
17710 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
17720 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
17730 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
17740 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
17750 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
17760 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
17770 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
17780 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
17790 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
177a0 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
177b0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
177c0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
177d0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
177e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
177f0 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
17800 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
17810 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
17820 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
17830 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
17840 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
17850 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
17860 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
17870 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
17880 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
17890 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
178a0 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
178b0 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
178c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
178d0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
178e0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e  ssert( pFile->in
178f0 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20  NormalWrite==0. 
17900 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
17910 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a  le->dbUpdate==0.
17920 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
17930 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
17940 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69  ng==1 );.    pFi
17950 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
17960 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
17970 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65    .    if( pFile
17980 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ->eFileLock==EXC
17990 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
179a0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
179b0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
179c0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
179d0 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45  RED_FIRST, SHARE
179e0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
179f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17a00 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63  _OK && (eFileLoc
17a10 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
17a20 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  | pInode->nShare
17a30 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  d>1) ){.        
17a40 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62  /* only re-estab
17a50 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
17a60 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72  lock if necessar
17a70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
17a80 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
17a90 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
17aa0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17ab0 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e;.        rc = 
17ac0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17ad0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17ae0 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
17af0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
17b00 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
17b10 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b   skipShared = 1;
17b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17b30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17b40 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
17b50 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
17b60 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  G_LOCK ){.      
17b70 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
17b80 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17b90 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
17ba0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
17bb0 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   } .    if( rc==
17bc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
17bd0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52  le->eFileLock>=R
17be0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
17bf0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
17c00 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
17c10 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17c20 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17c30 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
17c40 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
17c50 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
17c60 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
17c70 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
17c80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17ca0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
17cb0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
17cc0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29  ode->nShared>1))
17cd0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
17ce0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
17cf0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
17d00 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
17d10 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c  ITE_OK && eFileL
17d20 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
17d30 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
17d40 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
17d50 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
17d60 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
17d70 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
17d80 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
17d90 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
17da0 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
17db0 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
17dc0 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
17dd0 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e     */.    unsign
17de0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
17df0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
17e00 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
17e10 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
17e20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
17e30 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ed--;.    if( pI
17e40 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30  node->nShared==0
17e50 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61   ){.      Simula
17e60 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
17e70 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  1);.      Simula
17e80 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
17e90 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  ) ).      Simula
17ea0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
17eb0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73  0);.      if( !s
17ec0 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20  kipShared ){.   
17ed0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
17ee0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
17ef0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
17f00 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
17f10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17f20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
17f30 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
17f40 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
17f50 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
17f60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
17f70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
17f80 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
17f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17fa0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
17fb0 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  --;.      assert
17fc0 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
17fd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
17fe0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
17ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
18000 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
18010 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
18020 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
18030 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
18040 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18050 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
18060 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
18070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18080 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
18090 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46  ile & cleanup AF
180a0 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  P specific locki
180b0 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73  ng context .*/.s
180c0 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f  tatic int afpClo
180d0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
180e0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
180f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
18100 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
18110 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
18120 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
18130 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
18140 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e  NO_LOCK);.    un
18150 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
18160 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
18170 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e  Inode && pFile->
18180 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
18190 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
181a0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
181b0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
181c0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
181d0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
181e0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
181f0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
18200 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
18210 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
18220 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
18230 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
18240 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
18250 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
18260 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
18270 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  d when.      ** 
18280 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
18290 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
182a0 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
182b0 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
182c0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
182d0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
182e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
182f0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
18300 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
18310 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
18320 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
18330 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
18340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18350 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
18360 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
18370 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18380 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
18390 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
183a0 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
183b0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
183c0 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
183d0 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
183e0 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
183f0 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
18400 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
18410 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
18420 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
18430 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
18440 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
18450 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
18460 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
18470 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
18480 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
18490 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
184a0 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
184b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
184c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184d0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
184e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
184f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18520 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
18530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18570 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18590 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
185a0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
185c0 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
185d0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
185e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
185f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
18600 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
18610 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
18620 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
18630 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
18640 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
18650 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
18660 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
18670 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
18680 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
18690 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
186a0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
186b0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
186c0 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
186d0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
186e0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
186f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
18700 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
18710 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
18720 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
18730 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
18740 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
18750 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
18760 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
18770 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
18780 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
18790 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
187a0 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
187b0 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
187c0 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
187d0 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
187e0 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
187f0 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
18800 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
18810 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
18820 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
18830 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
18840 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
18850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18860 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
18870 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
18880 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
18890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
18950 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
18960 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
18990 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
189a0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
189b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
189c0 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
189d0 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
189e0 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
189f0 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
18a00 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
18a10 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
18a20 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
18a30 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
18a40 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
18a50 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
18a60 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
18a70 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
18a80 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
18a90 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
18aa0 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
18ab0 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
18ac0 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
18ad0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
18ae0 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
18af0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
18b00 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
18b10 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
18b20 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
18b30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18b40 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
18b50 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
18b60 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
18b70 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
18b80 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
18b90 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
18ba0 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
18bb0 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
18bc0 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
18bd0 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
18be0 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
18bf0 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
18c00 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
18c10 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
18c20 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20 62  * any any form b
18c30 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
18c40 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
18c50 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
18c60 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
18c70 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
18c80 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
18c90 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
18ca0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
18cb0 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
18cc0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
18cd0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
18ce0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18d00 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
18d10 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
18d20 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
18d30 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
18d40 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
18d50 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
18d60 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
18d70 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
18d80 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
18d90 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
18da0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
18db0 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
18dc0 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
18dd0 78 31 66 66 66 66 29 20 29 3b 0a 20 20 63 6e 74  x1ffff) );.  cnt
18de0 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 64   &= 0x1ffff;.  d
18df0 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  o{.#if defined(U
18e00 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f  SE_PREAD).    go
18e10 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e  t = osPread(id->
18e20 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66  h, pBuf, cnt, of
18e30 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c  fset);.    Simul
18e40 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20  ateIOError( got 
18e50 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65  = -1 );.#elif de
18e60 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
18e70 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50  4).    got = osP
18e80 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
18e90 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
18ea0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
18eb0 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
18ec0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77  );.#else.    new
18ed0 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69  Offset = lseek(i
18ee0 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45  d->h, offset, SE
18ef0 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
18f00 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65  ulateIOError( ne
18f10 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20  wOffset-- );.   
18f20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d   if( newOffset!=
18f30 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  offset ){.      
18f40 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
18f50 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 28   -1 ){.        (
18f60 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
18f70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
18f80 6f 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  o;.      }else{.
18f90 20 20 20 20 20 20 20 20 28 28 75 6e 69 78 46 69          ((unixFi
18fa0 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18fb0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  no = 0;.      }.
18fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
18fd0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d  .    }.    got =
18fe0 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70   osRead(id->h, p
18ff0 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69  Buf, cnt);.#endi
19000 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63  f.    if( got==c
19010 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
19020 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19030 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
19040 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20  NTR ){ got = 1; 
19050 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20  continue; }.    
19060 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20    prior = 0;.   
19070 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
19080 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
19090 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 62 72 65  errno;.      bre
190a0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
190b0 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20  ( got>0 ){.     
190c0 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20   cnt -= got;.   
190d0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74     offset += got
190e0 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d  ;.      prior +=
190f0 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66   got;.      pBuf
19100 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b   = (void*)(got +
19110 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20   (char*)pBuf);. 
19120 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67     }.  }while( g
19130 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ot>0 );.  TIMER_
19140 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
19150 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
19160 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
19170 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d  .            id-
19180 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f  >h, got+prior, o
19190 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d  ffset-prior, TIM
191a0 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
191b0 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72  return got+prior
191c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
191d0 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
191e0 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
191f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19200 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
19210 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
19220 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
19230 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
19240 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
19250 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
19260 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
19270 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19280 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
19290 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
192a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
192b0 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
192c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
192d0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
192e0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
192f0 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
19300 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
19310 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
19320 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
19330 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
19340 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
19350 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
19360 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
19370 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
19380 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
19390 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
193a0 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
193b0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
193c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
193d0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
193e0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
193f0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
19400 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  ..  /* Deal with
19410 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
19420 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
19430 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
19440 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
19450 61 74 61 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ata to the memor
19460 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
19470 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
19480 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
19490 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
194a0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
194b0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
194c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
194d0 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
194e0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
194f0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
19500 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
19510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
19530 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
19540 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
19550 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
19560 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
19570 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
19580 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
19590 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
195a0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
195b0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
195c0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
195d0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
195e0 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  py;.    }.  }.. 
195f0 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
19600 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
19610 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
19620 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
19630 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19640 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
19650 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
19660 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
19670 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
19680 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
19690 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
196a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
196b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
196c0 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  0; /* not a syst
196d0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
196e0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
196f0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
19700 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
19710 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
19720 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
19730 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
19740 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
19750 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
19760 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
19770 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
19780 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
19790 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
197a0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
197b0 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
197c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
197d0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
197e0 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
197f0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
19800 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
19810 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
19820 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
19830 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
19840 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
19850 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
19860 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
19870 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
19880 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
19890 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
198a0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
198b0 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21   int got;.#if (!
198c0 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
198d0 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55  D) && !defined(U
198e0 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69  SE_PREAD64)).  i
198f0 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65  64 newOffset;.#e
19900 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 63  ndif.  assert( c
19910 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
19920 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  ) );.  cnt &= 0x
19930 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
19940 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
19950 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
19960 6f 7b 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74  o{ got = osPwrit
19970 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
19980 6e 74 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68  nt, offset); }wh
19990 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
199a0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
199b0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
199c0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67  PREAD64).  do{ g
199d0 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28  ot = osPwrite64(
199e0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
199f0 2c 20 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65  , offset);}while
19a00 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
19a10 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
19a20 20 20 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66    do{.    newOff
19a30 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
19a40 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19a50 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19a60 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
19a70 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
19a80 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
19a90 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
19aa0 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
19ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e   ){.        ((un
19ac0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
19ad0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
19ae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19af0 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
19b00 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  )id)->lastErrno 
19b10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
19b20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
19b30 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73    }.    got = os
19b40 57 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75  Write(id->h, pBu
19b50 66 2c 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c  f, cnt);.  }whil
19b60 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
19b70 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
19b80 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
19b90 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
19ba0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
19bb0 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
19bc0 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53  errno;.  }..  OS
19bd0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 20 20  TRACE(("WRITE   
19be0 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
19bf0 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67  llu\n", id->h, g
19c00 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45  ot, offset, TIME
19c10 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72  R_ELAPSED));.  r
19c20 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f  eturn got;.}.../
19c30 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
19c40 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
19c50 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
19c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
19c70 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
19c80 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
19c90 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
19ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
19cb0 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
19cc0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
19cd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
19ce0 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
19cf0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
19d00 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46  fset .){.  unixF
19d10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
19d20 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
19d30 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
19d40 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
19d50 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
19d60 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
19d70 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19d80 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
19d90 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19da0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
19db0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
19dc0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
19dd0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
19de0 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
19df0 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
19e00 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
19e10 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
19e20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
19e30 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
19e40 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
19e50 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
19e60 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
19e70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
19e80 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
19e90 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
19ea0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
19eb0 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
19ec0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e  sed to.  ** doin
19ed0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
19ee0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
19ef0 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
19f00 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
19f10 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
19f20 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65  se file) then re
19f30 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
19f40 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  at the database.
19f50 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64    ** has changed
19f60 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
19f70 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
19f80 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72   modified, recor
19f90 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74  d that.  ** fact
19fa0 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
19fb0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
19fc0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69  Write ){.    pFi
19fd0 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31  le->dbUpdate = 1
19fe0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
19ff0 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
1a000 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  fied */.    if( 
1a010 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66  offset<=24 && of
1a020 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a  fset+amt>=27 ){.
1a030 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1a040 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72      char oldCntr
1a050 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  [4];.      Simul
1a060 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a070 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
1a080 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
1a090 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20  e, 24, oldCntr, 
1a0a0 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4);.      Simula
1a0b0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a0c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a0d0 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c  !=4 || memcmp(ol
1a0e0 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29  dCntr, &((char*)
1a0f0 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d  pBuf)[24-offset]
1a100 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)!=0 ){.     
1a110 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1a120 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a  ntrChng = 1;  /*
1a130 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1a140 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61   counter has cha
1a150 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  nged */.      }.
1a160 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1a170 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  ..  /* Deal with
1a180 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1a190 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1a1a0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1a1b0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1a1c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1a1d0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1a1e0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1a1f0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1a200 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1a210 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1a220 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1a230 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1a240 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1a250 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1a260 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1a270 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1a280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a2a0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1a2b0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1a2c0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1a2d0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1a2e0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1a2f0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1a300 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1a310 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1a320 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1a330 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1a340 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1a350 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1a360 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
1a370 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  && (wrote = seek
1a380 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1a390 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
1a3a0 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
1a3b0 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
1a3c0 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
1a3d0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
1a3e0 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
1a3f0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
1a400 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
1a410 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
1a420 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1a430 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
1a440 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20  0, amt=1 ));..  
1a450 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20  if( amt>0 ){.   
1a460 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20   if( wrote<0 && 
1a470 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a480 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20  !=ENOSPC ){.    
1a490 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
1a4a0 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
1a4b0 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
1a4c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1a4d0 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
1a4e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1a4f0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f 2a  astErrno = 0; /*
1a500 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
1a510 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ror */.      ret
1a520 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1a530 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1a540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a550 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1a560 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
1a570 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1a580 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
1a590 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
1a5a0 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1a5b0 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
1a5c0 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
1a5d0 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74  e occurring at t
1a5e0 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
1a5f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1a600 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
1a610 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
1a620 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
1a630 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  endif../*.** We 
1a640 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73  do not trust sys
1a650 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20  tems to provide 
1a660 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73  a working fdatas
1a670 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e  ync().  Some do.
1a680 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f  .** Others do no
1a690 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77  .  To be safe, w
1a6a0 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74  e will stick wit
1a6b0 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20  h the (slightly 
1a6c0 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63  slower).** fsync
1a6d0 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20  (). If you know 
1a6e0 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d  that your system
1a6f0 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64   does support fd
1a700 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63  atasync() correc
1a710 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d  tly,.** then sim
1a720 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68  ply compile with
1a730 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61   -Dfdatasync=fda
1a740 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64  tasync.*/.#if !d
1a750 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63  efined(fdatasync
1a760 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  ).# define fdata
1a770 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
1a780 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
1a790 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
1a7a0 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
1a7b0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
1a7c0 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
1a7d0 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
1a7e0 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
1a7f0 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
1a800 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
1a810 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
1a820 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
1a830 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
1a840 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
1a850 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1a860 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
1a870 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1a880 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
1a890 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
1a8a0 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1a8b0 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1a8c0 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1a8d0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1a8e0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1a8f0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1a900 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1a910 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1a920 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1a930 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1a940 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1a950 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1a960 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1a970 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1a980 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1a990 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1a9a0 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1a9b0 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1a9c0 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1a9d0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1a9e0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1a9f0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1aa00 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1aa10 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1aa20 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1aa30 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1aa40 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1aa50 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1aa60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1aa70 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1aa80 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1aa90 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1aaa0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1aab0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1aac0 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1aad0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1aae0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1aaf0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1ab00 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1ab10 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1ab20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1ab30 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1ab40 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1ab50 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1ab60 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1ab70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1ab80 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1ab90 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1aba0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1abb0 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1abc0 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1abd0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1abe0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1abf0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1ac00 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1ac10 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1ac20 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1ac30 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1ac40 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1ac50 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1ac60 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1ac70 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1ac80 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1ac90 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1aca0 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1acb0 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1acc0 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1acd0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1ace0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1acf0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1ad00 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1ad10 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1ad20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1ad30 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1ad40 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1ad50 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1ad60 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1ad70 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1ad80 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1ad90 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1ada0 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1adb0 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1adc0 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1add0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1ade0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1adf0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1ae00 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1ae10 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1ae20 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1ae30 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1ae40 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1ae50 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1ae60 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1ae70 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1ae80 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1ae90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1aea0 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1aeb0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1aec0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1aed0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1aee0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1aef0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1af00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1af10 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1af20 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1af30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1af40 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1af50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1af60 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1af70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1af80 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1af90 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1afa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1afb0 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1afc0 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1afd0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1afe0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1aff0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1b000 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1b010 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1b020 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1b030 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1b040 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1b050 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b060 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1b070 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1b080 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1b090 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1b0a0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1b0b0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1b0c0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1b0d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1b0e0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1b0f0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
1b100 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1b110 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
1b120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
1b130 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1b140 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1b150 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ){.    rc = osFc
1b160 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1b170 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
1b180 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1b190 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1b1a0 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1b1b0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1b1c0 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1b1d0 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1b1e0 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1b1f0 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1b200 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1b210 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1b220 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1b230 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1b240 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1b250 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1b260 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1b270 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1b280 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1b290 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1b2a0 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1b2b0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1b2c0 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1b2d0 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1b2e0 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1b2f0 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1b300 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1b310 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1b320 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1b330 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1b340 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1b350 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1b360 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1b370 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1b380 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1b390 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1b3a0 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1b3b0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1b3c0 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1b3d0 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1b3e0 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1b3f0 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1b400 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1b410 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1b420 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1b430 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1b440 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1b450 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1b460 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1b470 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1b480 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1b490 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1b4a0 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1b4b0 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1b4c0 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1b4d0 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1b4e0 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1b4f0 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1b500 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1b510 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1b520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b530 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1b540 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1b550 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1b560 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1b570 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1b580 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1b590 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1b5a0 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1b5b0 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1b5c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1b5d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1b5e0 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1b5f0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1b600 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1b610 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1b620 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1b630 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1b640 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1b650 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1b660 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1b670 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1b680 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1b690 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1b6a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1b6b0 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1b6c0 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1b6d0 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1b6e0 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1b6f0 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1b700 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1b710 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1b720 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1b730 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1b740 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1b750 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1b760 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1b770 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1b780 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1b790 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1b7a0 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1b7b0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1b7c0 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1b7d0 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1b7e0 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1b7f0 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1b800 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1b810 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1b820 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1b830 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1b840 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1b850 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1b860 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1b870 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1b880 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1b890 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1b8a0 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1b8b0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1b8c0 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1b8d0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1b8e0 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1b8f0 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1b900 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1b910 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1b920 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1b930 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1b940 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1b950 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1b960 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1b970 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1b980 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1b990 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1b9a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1b9b0 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1b9c0 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1b9d0 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1b9e0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1b9f0 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1ba00 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1ba10 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1ba20 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1ba30 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1ba40 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1ba50 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
1ba60 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1ba70 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b  );.  if( ii>0 ){
1ba80 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1ba90 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
1baa0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1bab0 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1bac0 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1bad0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1bae0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1baf0 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1bb00 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1bb10 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
1bb20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65   *pFd = fd;.  re
1bb30 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49  turn (fd>=0?SQLI
1bb40 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72  TE_OK:unixLogErr
1bb50 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1bb60 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c  EN_BKPT, "open",
1bb70 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a   zDirname));.}..
1bb80 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1bb90 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
1bba0 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
1bbb0 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
1bbc0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
1bbd0 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
1bbe0 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
1bbf0 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
1bc00 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
1bc10 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
1bc20 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
1bc30 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
1bc40 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
1bc50 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
1bc60 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1bc70 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
1bc80 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1bc90 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
1bca0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
1bcb0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
1bcc0 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
1bcd0 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
1bce0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1bcf0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
1bd00 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1bd10 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
1bd20 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
1bd30 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
1bd40 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1bd50 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
1bd60 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
1bd70 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
1bd80 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
1bd90 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
1bda0 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
1bdb0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bdc0 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
1bdd0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
1bde0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1bdf0 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
1be00 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
1be10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
1be20 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
1be30 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
1be40 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
1be50 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
1be60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1be70 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  xSync(sqlite3_fi
1be80 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
1be90 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1bea0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1beb0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1bec0 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e  ..  int isDataOn
1bed0 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49  ly = (flags&SQLI
1bee0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1bef0 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73  );.  int isFulls
1bf00 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30  ync = (flags&0x0
1bf10 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1bf20 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  FULL;..  /* Chec
1bf30 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
1bf40 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1bf50 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
1bf60 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
1bf70 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1bf80 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1bf90 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
1bfa0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1bfb0 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
1bfc0 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
1bfd0 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
1bfe0 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
1bff0 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
1c000 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
1c010 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
1c020 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
1c030 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
1c040 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
1c050 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1c060 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1c070 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
1c080 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1c090 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
1c0a0 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
1c0b0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d  ile->h));.  rc =
1c0c0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
1c0d0 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63  e->h, isFullsync
1c0e0 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20  , isDataOnly);. 
1c0f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c100 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1c110 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
1c120 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1c130 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  no;.    return u
1c140 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1c150 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
1c160 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46  "full_fsync", pF
1c170 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
1c180 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e  ..  /* Also fsyn
1c190 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  c the directory 
1c1a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
1c1b0 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59  ile if the DIRSY
1c1c0 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  NC flag.  ** is 
1c1d0 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20  set.  This is a 
1c1e0 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 61  one-time occurra
1c1f0 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65  nce.  Many syste
1c200 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49  ms (examples: AI
1c210 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62  X).  ** are unab
1c220 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69  le to fsync a di
1c230 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f  rectory, so igno
1c240 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65  re errors on the
1c250 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69   fsync..  */.  i
1c260 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
1c270 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
1c280 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e  IRSYNC ){.    in
1c290 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54  t dirfd;.    OST
1c2a0 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25  RACE(("DIRSYNC %
1c2b0 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  s (have_fullfsyn
1c2c0 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
1c2d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  )\n", pFile->zPa
1c2e0 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  th,.            
1c2f0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
1c300 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20  isFullsync));.  
1c310 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
1c320 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50  ectory(pFile->zP
1c330 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
1c340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c350 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20  _OK && dirfd>=0 
1c360 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73  ){.      full_fs
1c370 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29  ync(dirfd, 0, 0)
1c380 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
1c390 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66  lose(pFile, dirf
1c3a0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
1c3b0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1c3c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1c3d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1c3f0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1c400 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
1c410 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20  _DIRSYNC;.  }.  
1c420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c430 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1c440 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
1c450 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
1c460 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1c470 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
1c480 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  _file *id, i64 n
1c490 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c  Byte){.  unixFil
1c4a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c4b0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1c4c0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
1c4d0 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
1c4e0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
1c4f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
1c500 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a  RUNCATE );..  /*
1c510 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
1c520 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
1c530 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
1c540 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
1c550 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
1c560 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
1c570 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
1c580 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
1c590 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
1c5a0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
1c5b0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
1c5c0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
1c5d0 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
1c5e0 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
1c5f0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
1c600 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1c610 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
1c620 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
1c630 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
1c640 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1c650 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1c660 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74  }..  rc = robust
1c670 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1c680 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79 74  ->h, (off_t)nByt
1c690 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
1c6a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c6b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1c6c0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1c6d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c6e0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1c6f0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1c700 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
1c710 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1c720 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20  DEBUG.    /* If 
1c730 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e  we are doing a n
1c740 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61  ormal write to a
1c750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1c760 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20  as opposed to.  
1c770 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74    ** doing a hot
1c780 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1c790 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20  k or a write to 
1c7a0 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20  some file other 
1c7b0 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f  than a.    ** no
1c7c0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1c7d0 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63  le) and we trunc
1c7e0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
1c7f0 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20  zero length,.   
1c800 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69   ** that effecti
1c810 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  vely updates the
1c820 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
1c830 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70    This might hap
1c840 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  pen.    ** when 
1c850 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61  restoring a data
1c860 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62  base using the b
1c870 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61  ackup API from a
1c880 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20   zero-length.   
1c890 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20   ** source..    
1c8a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  */.    if( pFile
1c8b0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
1c8c0 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  && nByte==0 ){. 
1c8d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1c8e0 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20  sCntrChng = 1;. 
1c8f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1c900 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1c910 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
1c920 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
1c930 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
1c940 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
1c950 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
1c960 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1c970 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
1c980 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
1c990 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
1c9a0 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
1c9b0 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
1c9c0 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
1c9d0 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
1c9e0 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
1c9f0 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
1ca00 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1ca10 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1ca20 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
1ca30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ca40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1ca50 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
1ca60 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1ca70 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
1ca80 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1ca90 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
1caa0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1cab0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
1cac0 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
1cad0 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
1cae0 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
1caf0 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
1cb00 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1cb10 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1cb20 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1cb30 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1cb40 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1cb50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1cb60 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1cb70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1cb80 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1cb90 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1cba0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1cbb0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1cbc0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1cbd0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f  dInodeInfo() pro
1cbe0 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74  cedure.  ** writ
1cbf0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  es a single byte
1cc00 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20   into that file 
1cc10 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1cc20 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20   around a bug.  
1cc30 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d  ** in the OS-X m
1cc40 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e  sdos filesystem.
1cc50 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76    In order to av
1cc60 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  oid problems wit
1cc70 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79  h upper.  ** lay
1cc80 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ers, we need to 
1cc90 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65  report this file
1cca0 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76   size as zero ev
1ccb0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a  en though it is.
1ccc0 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20    ** really 1.  
1ccd0 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20   Ticket #3260.. 
1cce0 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65   */.  if( *pSize
1ccf0 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30  ==1 ) *pSize = 0
1cd00 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ;...  return SQL
1cd10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
1cd20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1cd30 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1cd40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1cd50 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66  ./*.** Handler f
1cd60 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  or proxy-locking
1cd70 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65   file-control ve
1cd80 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65  rbs.  Defined be
1cd90 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72  low in the.** pr
1cda0 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64  oxying locking d
1cdb0 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ivision..*/.stat
1cdc0 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65  ic int proxyFile
1cdd0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1cde0 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
1cdf0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a  ;.#endif../* .**
1ce00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ce10 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64  s called to hand
1ce20 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  le the SQLITE_FC
1ce30 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a  NTL_SIZE_HINT .*
1ce40 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f  * file-control o
1ce50 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72  peration.  Enlar
1ce60 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ge the database 
1ce70 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a  to nBytes in siz
1ce80 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70  e.** (rounded up
1ce90 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75   to the next chu
1cea0 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68  nk-size).  If th
1ceb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1cec0 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20  ready.** nBytes 
1ced0 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20  or larger, this 
1cee0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1cef0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
1cf00 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  t fcntlSizeHint(
1cf10 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1cf20 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69   i64 nByte){.  i
1cf30 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1cf40 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e  k>0 ){.    i64 n
1cf50 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cf60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1cf70 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1cf80 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
1cf90 74 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  t buf;          
1cfa0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68      /* Used to h
1cfb0 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  old return value
1cfc0 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a  s of fstat() */.
1cfd0 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73     .    if( osFs
1cfe0 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
1cff0 75 66 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  uf) ) return SQL
1d000 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1d010 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
1d020 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
1d030 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
1d040 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1d050 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
1d060 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
1d070 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
1d080 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1d090 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
1d0a0 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
1d0b0 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
1d0c0 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
1d0d0 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
1d0e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1d0f0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
1d100 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
1d110 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
1d120 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
1d130 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
1d140 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
1d150 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
1d160 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
1d170 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
1d180 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
1d190 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
1d1a0 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
1d1b0 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
1d1c0 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
1d1d0 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
1d1e0 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
1d1f0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
1d200 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
1d210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
1d220 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d230 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1d240 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1d250 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1d260 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1d270 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1d280 20 46 69 72 73 74 20 75 73 65 0a 20 20 20 20 20   First use.     
1d290 20 2a 2a 20 66 74 72 75 6e 63 61 74 65 28 29 20   ** ftruncate() 
1d2a0 74 6f 20 73 65 74 20 74 68 65 20 66 69 6c 65 20  to set the file 
1d2b0 73 69 7a 65 2c 20 74 68 65 6e 20 77 72 69 74 65  size, then write
1d2c0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1d2d0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  o.      ** the l
1d2e0 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1d2f0 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 74 68   block within th
1d300 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1d310 6e 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a  n. This.      **
1d320 20 69 73 20 74 68 65 20 73 61 6d 65 20 74 65 63   is the same tec
1d330 68 6e 69 71 75 65 20 75 73 65 64 20 62 79 20 67  hnique used by g
1d340 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  libc to implemen
1d350 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74  t posix_fallocat
1d360 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  e().      ** on 
1d370 73 79 73 74 65 6d 73 20 74 68 61 74 20 64 6f 20  systems that do 
1d380 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1d390 66 61 6c 6c 6f 63 61 74 65 28 29 20 73 79 73 74  fallocate() syst
1d3a0 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  em call..      *
1d3b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1d3c0 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1d3d0 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1d3e0 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1d3f0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1d400 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d410 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1d420 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1d430 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  ..      if( robu
1d440 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1d450 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b  le->h, nSize) ){
1d460 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1d470 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1d480 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1d490 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1d4a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1d4b0 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1d4c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1d4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d4e0 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e 73  iWrite = ((buf.s
1d4f0 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b 20  t_size + 2*nBlk 
1d500 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d  - 1)/nBlk)*nBlk-
1d510 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
1d520 69 57 72 69 74 65 3c 6e 53 69 7a 65 20 29 7b 0a  iWrite<nSize ){.
1d530 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
1d540 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
1d550 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c  e(pFile, iWrite,
1d560 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   "", 1);.       
1d570 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29   if( nWrite!=1 )
1d580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1d590 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1d5a0 20 20 20 20 69 57 72 69 74 65 20 2b 3d 20 6e 42      iWrite += nB
1d5b0 6c 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  lk;.      }.#end
1d5c0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
1d5d0 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 4c  if( pFile->mmapL
1d5e0 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  imit>0 ){.    in
1d5f0 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
1d600 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
1d610 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
1d620 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1d630 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
1d640 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1d650 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
1d660 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
1d670 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1d680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1d690 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1d6a0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1d6b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d6c0 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d  ..    rc = unixM
1d6d0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  apfile(pFile, nB
1d6e0 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  yte);.    return
1d6f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   rc;.  }..  retu
1d700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d710 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
1d720 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
1d730 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
1d740 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
1d750 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
1d760 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
1d770 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1d780 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
1d790 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
1d7a0 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
1d7b0 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
1d7c0 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
1d7d0 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
1d7e0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1d7f0 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
1d800 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28  oid unixModeBit(
1d810 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1d820 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
1d830 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
1d840 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
1d850 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
1d860 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1d870 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
1d880 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
1d890 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
1d8a0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
1d8b0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1d8c0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1d8d0 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
1d8e0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1d8f0 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
1d900 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
1d910 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
1d920 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
1d930 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1d940 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1d950 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1d960 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1d970 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1d980 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1d990 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1d9a0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
1d9b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1d9c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1d9d0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1d9e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1d9f0 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
1da00 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1da10 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
1da20 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
1da30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1da40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1da50 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1da60 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1da70 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  pArg = pFile->la
1da80 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
1da90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1daa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dab0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1dac0 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1dad0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1dae0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1daf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1db00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1db10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1db20 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1db30 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1db40 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1db50 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1db60 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53       rc = fcntlS
1db70 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a  izeHint(pFile, *
1db80 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
1db90 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1dba0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1dbb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1dbc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1dbd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
1dbe0 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
1dbf0 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
1dc00 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  e, UNIXFILE_PERS
1dc10 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70  IST_WAL, (int*)p
1dc20 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
1dc30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dc40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1dc50 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
1dc60 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
1dc70 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1dc80 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1dc90 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
1dca0 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
1dcb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dcc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1dcd0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
1dce0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
1dcf0 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
1dd00 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1dd10 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e   pFile->pVfs->zN
1dd20 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1dd30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dd40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1dd50 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
1dd60 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
1dd70 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
1dd80 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1dd90 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
1dda0 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  thname );.      
1ddb0 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20  if( zTFile ){.  
1ddc0 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d        unixGetTem
1ddd0 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
1dde0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
1ddf0 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
1de00 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1de10 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
1de20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1de30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1de40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1de50 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
1de60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1de70 61 70 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  apLimit = *(i64*
1de80 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74  )pArg;.      ret
1de90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dea0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1deb0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
1dec0 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20  The pager calls 
1ded0 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73  this method to s
1dee0 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61  ignal that it ha
1def0 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20  s done.    ** a 
1df00 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61  rollback and tha
1df10 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
1df20 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68  s therefore unch
1df30 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  anged and.    **
1df40 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20   it hence it is 
1df50 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73  OK for the trans
1df60 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f  action change co
1df70 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20  unter to be.    
1df80 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ** unchanged..  
1df90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1dfa0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1dfb0 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20  CHANGED: {.     
1dfc0 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1dfd0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
1dfe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1dff0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
1e000 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1e010 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1e020 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1e030 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
1e040 61 73 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  ase SQLITE_SET_L
1e050 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
1e060 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 47 45    case SQLITE_GE
1e070 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1e080 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1e090 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1e0a0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1e0b0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1e0c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e0d0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1e0e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1e0f0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1e100 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1e110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e120 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1e130 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1e140 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1e150 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1e160 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1e170 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1e180 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1e190 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1e1a0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1e1b0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1e1c0 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1e1d0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1e1e0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1e1f0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1e200 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1e210 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1e220 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1e230 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1e240 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1e250 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1e260 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1e270 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1e280 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1e290 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1e2a0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1e2b0 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1e2c0 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1e2d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1e2e0 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1e2f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1e300 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1e310 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1e320 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1e330 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1e340 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1e350 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1e360 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1e370 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1e380 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1e390 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1e3a0 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1e3b0 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1e3c0 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1e3d0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1e3e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1e3f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1e400 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1e410 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1e420 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1e430 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1e440 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1e450 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1e460 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1e470 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1e480 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1e490 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1e4a0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1e4b0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1e4c0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1e4d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1e4e0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1e4f0 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1e500 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1e510 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1e520 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1e530 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1e540 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1e550 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1e560 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1e570 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e580 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1e590 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1e5a0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1e5b0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1e5c0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1e5d0 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1e5e0 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1e5f0 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1e600 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1e610 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1e620 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1e630 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1e640 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1e650 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1e680 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1e690 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1e6a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1e6b0 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1e6c0 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1e6d0 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1e6e0 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1e710 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1e720 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1e730 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1e740 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1e750 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1e760 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1e770 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1e780 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1e790 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1e7a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1e7b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1e7c0 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1e7d0 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1e7e0 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1e7f0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1e800 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1e810 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1e820 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1e830 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1e840 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1e850 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1e860 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1e8a0 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1e8b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1e8c0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1e8d0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1e8e0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1e8f0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1e930 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1e940 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1e950 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1e960 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1e970 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1e980 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1e990 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1e9a0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1e9b0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1e9c0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1e9d0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1e9e0 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1e9f0 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1ea00 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1ea10 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1ea20 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1ea30 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1ea40 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1ea50 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1ea60 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1ea90 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1eaa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1eab0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1eac0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1ead0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1eae0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1eaf0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1eb20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1eb30 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1eb40 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1eb50 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1eb60 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1eb70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1eb80 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1eb90 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1eba0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1ebb0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1ebc0 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1ebd0 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1ebe0 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1ebf0 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1ec00 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1ec10 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1ec20 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1ec30 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1ec40 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1ec50 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1ec60 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1ec70 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1ec80 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1ec90 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1ecd0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1ece0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1ecf0 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1ed00 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1ed10 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1ed20 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1ed30 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1ed40 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1ed50 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ed60 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1ed70 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1ed80 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1ed90 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1eda0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1edb0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1edc0 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1edd0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1ede0 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1edf0 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1ee00 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1ee10 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1ee20 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1ee30 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1ee40 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1ee70 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1ee80 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1ee90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1eea0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1eeb0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1eec0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1eed0 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
1eee0 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
1eef0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1ef00 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1ef10 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1ef20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1ef30 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1ef40 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ef70 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1ef80 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1ef90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
1efa0 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
1efb0 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
1efc0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1efd0 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
1efe0 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
1eff0 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
1f000 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
1f010 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
1f020 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
1f030 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f040 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1f050 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f060 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1f070 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1f080 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1f090 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f0a0 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
1f0b0 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
1f0c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f0d0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1f0e0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1f0f0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
1f100 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
1f110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1f120 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1f130 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
1f140 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
1f150 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
1f160 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73 69  contraversial si
1f170 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
1f180 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1f190 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
1f1a0 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
1f1b0 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
1f1c0 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
1f1d0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
1f1e0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
1f1f0 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
1f200 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
1f210 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
1f220 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
1f230 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
1f240 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
1f250 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
1f260 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
1f270 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
1f280 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
1f290 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
1f2a0 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
1f2b0 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
1f2c0 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
1f2d0 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
1f2e0 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
1f2f0 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
1f300 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
1f310 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1f320 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
1f330 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
1f340 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
1f350 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
1f360 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
1f370 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
1f380 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1f390 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
1f3a0 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
1f3b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1f3c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1f3d0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1f3e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1f3f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1f400 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1f410 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
1f420 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
1f430 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
1f440 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
1f450 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
1f460 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1f470 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1f480 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
1f490 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
1f4a0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1f4b0 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
1f4c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1f4d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f4e0 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  _WAL.../*.** Obj
1f4f0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1f500 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
1f510 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
1f520 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
1f530 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1f540 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1f550 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
1f560 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
1f570 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
1f580 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
1f590 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
1f5a0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
1f5b0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
1f5c0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
1f5d0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f5e0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
1f5f0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1f600 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1f610 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
1f620 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
1f630 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
1f640 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
1f650 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
1f660 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
1f670 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
1f680 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
1f690 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
1f6a0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
1f6b0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
1f6c0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
1f6d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
1f6e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
1f6f0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
1f700 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
1f710 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
1f720 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
1f730 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
1f740 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1f750 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
1f760 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
1f770 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
1f780 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
1f790 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
1f7a0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
1f7b0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
1f7c0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
1f7d0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1f7e0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1f7f0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1f800 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1f810 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1f820 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1f830 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1f840 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1f850 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1f860 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
1f870 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
1f880 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
1f890 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
1f8a0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1f8b0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1f8c0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
1f8d0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1f8e0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
1f8f0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
1f900 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
1f910 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1f920 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1f930 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1f940 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1f950 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
1f960 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
1f970 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1f980 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
1f990 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
1f9a0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
1f9b0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
1f9c0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1f9d0 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1f9e0 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1f9f0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1fa00 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1fa10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1fa20 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
1fa30 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
1fa60 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
1fa70 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1fa80 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1fa90 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1faa0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
1fab0 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
1fac0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fad0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1fae0 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
1faf0 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
1fb00 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
1fb10 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
1fb20 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
1fb30 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
1fb40 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
1fb50 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1fb60 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
1fb90 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
1fba0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1fbb0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
1fbc0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1fbd0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
1fbe0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1fbf0 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
1fc00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1fc10 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
1fc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fc30 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
1fc40 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
1fc50 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
1fc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fc70 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1fc80 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
1fc90 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1fca0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1fcb0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
1fcc0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1fcd0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
1fce0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
1fcf0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
1fd00 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
1fd10 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
1fd20 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
1fd30 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
1fd40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
1fd50 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
1fd60 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
1fd70 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
1fd80 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
1fd90 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
1fda0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
1fdb0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
1fdc0 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
1fdd0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1fde0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1fdf0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
1fe00 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
1fe10 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1fe20 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1fe30 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1fe40 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1fe50 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
1fe60 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
1fe70 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
1fe80 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
1fe90 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1fea0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
1feb0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
1fec0 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
1fed0 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
1fee0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
1fef0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1ff00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ff10 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1ff20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
1ff30 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
1ff60 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
1ff70 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
1ff80 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
1ff90 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1ffa0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1ffb0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1ffc0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1ffd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ffe0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1fff0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
20000 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
20010 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
20020 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
20030 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
20040 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
20050 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
20060 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
20070 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
20080 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
20090 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
200a0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
200b0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
200c0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
200d0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
200e0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
200f0 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
20100 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
20110 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
20120 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
20130 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
20140 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
20150 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
20160 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
20170 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20180 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
20190 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
201a0 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c 79 20 6c  Node, /* Apply l
201b0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
201c0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
201d0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
201e0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
201f0 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
20200 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
20210 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
20220 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
20230 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
20240 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
20250 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
20280 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
20290 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
202a0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
202b0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
202c0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
202d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
202e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 52 65  LITE_OK;   /* Re
202f0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
20300 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
20310 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
20320 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20330 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
20340 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
20350 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20360 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
20370 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  mNode->mutex) ||
20380 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
20390 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72  =0 );..  /* Shar
203a0 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73  ed locks never s
203b0 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  pan more than on
203c0 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65  e byte */.  asse
203d0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b  rt( n==1 || lock
203e0 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b  Type!=F_RDLCK );
203f0 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65  ..  /* Locks are
20400 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f   within range */
20410 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
20420 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  && n<SQLITE_SHM_
20430 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  NLOCK );..  if( 
20440 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
20450 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
20460 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
20470 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
20480 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
20490 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20  sizeof(f));.    
204a0 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54  f.l_type = lockT
204b0 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65  ype;.    f.l_whe
204c0 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
204d0 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20      f.l_start = 
204e0 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65  ofst;.    f.l_le
204f0 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d  n = n;..    rc =
20500 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64   osFcntl(pShmNod
20510 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
20520 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
20530 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
20540 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
20550 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  Y;.  }..  /* Upd
20560 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  ate the global l
20570 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f  ock state and do
20580 20 64 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a   debug tracing *
20590 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
205a0 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61  DEBUG.  { u16 ma
205b0 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  sk;.  OSTRACE(("
205c0 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20  SHM-LOCK "));.  
205d0 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
205e0 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
205f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
20610 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
20620 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
20630 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
20640 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
20650 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
20660 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
20670 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
20680 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
20690 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
206a0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
206b0 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
206c0 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
206d0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
206e0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
206f0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
20700 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
20710 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
20720 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
20730 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
20740 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
20750 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
20760 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
20770 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
20780 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
20790 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
207a0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
207b0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
207c0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
207d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
207e0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
207f0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
20800 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
20810 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
20820 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
20830 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
20840 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
20850 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
20860 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
20870 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
20880 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
20890 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
208a0 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
208b0 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
208c0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
208d0 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
208e0 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
208f0 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
20900 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
20910 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
20920 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
20930 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
20940 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
20950 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  .../*.** Purge t
20960 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
20970 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
20980 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
20990 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
209a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
209b0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
209c0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
209d0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
209e0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
209f0 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
20a00 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
20a10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
20a20 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
20a30 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
20a40 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
20a50 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
20a60 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
20a70 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
20a80 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
20a90 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
20aa0 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
20ab0 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46  t( p->pInode==pF
20ac0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  d->pInode );.   
20ad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
20ae0 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
20af0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
20b00 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
20b10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d        if( p->h>=
20b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 75 6e  0 ){.        mun
20b30 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
20b40 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
20b50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20b70 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
20b80 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
20b90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
20ba0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
20bb0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
20bc0 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
20bd0 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
20be0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
20bf0 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
20c00 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
20c10 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
20c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20c30 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
20c40 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
20c50 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
20c60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
20c70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
20c80 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
20c90 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
20ca0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
20cb0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
20cc0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
20cd0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
20ce0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
20cf0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
20d00 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
20d10 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
20d20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
20d30 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
20d40 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
20d50 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
20d60 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
20d70 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
20d80 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
20d90 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
20da0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
20db0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
20dc0 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
20dd0 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
20de0 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
20df0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
20e00 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
20e10 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
20e20 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
20e30 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
20e40 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
20e50 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
20e60 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
20e70 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
20e80 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
20e90 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
20ea0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
20eb0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20ec0 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
20ed0 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
20ee0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
20ef0 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
20f00 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
20f10 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
20f20 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
20f30 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
20f40 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
20f50 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
20f60 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
20f70 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
20f80 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
20f90 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
20fa0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
20fb0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
20fc0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20fd0 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
20fe0 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
20ff0 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
21000 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
21010 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
21020 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
21030 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
21040 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
21050 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
21060 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
21070 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
21080 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
21090 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
210a0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
210b0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
210c0 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
210d0 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
210e0 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
210f0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
21100 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
21110 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
21120 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
21130 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
21140 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
21150 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
21160 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
21170 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
21180 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
21190 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
211a0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
211b0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
211c0 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
211d0 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
211e0 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
211f0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
21200 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
21210 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
21220 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
21230 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
21240 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
21250 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
21260 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
21270 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
21280 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
21290 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
212a0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
212b0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
212c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
212d0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
212e0 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
212f0 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
21300 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
21310 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
21320 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
21330 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
21340 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
21350 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
21360 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
21370 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
21380 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
21390 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
213a0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
213b0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
213c0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
213d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
213e0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
213f0 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
21400 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
21410 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
21420 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
21430 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
21440 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
21450 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
21460 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
21470 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
21480 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
21490 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
214a0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
214b0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
214c0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
214d0 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
214e0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
21510 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
21520 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
21530 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21540 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
21550 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
21560 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
21570 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21580 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
21590 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
215a0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
215b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
215c0 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
215d0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
215e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
215f0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
21600 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
21610 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
21620 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
21630 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
21640 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
21650 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
21660 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
21670 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
21680 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
21690 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
216a0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
216b0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
216c0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
216d0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
216e0 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
216f0 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
21700 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
21710 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
21720 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
21730 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
21740 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
21750 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
21760 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
21770 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
21780 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
21790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
217a0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
217b0 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
217c0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ile */..    /* C
217d0 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
217e0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
217f0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
21800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21810 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
21820 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
21830 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
21840 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
21850 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
21860 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
21870 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
21880 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
21890 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
218a0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
218b0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
218c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
218d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
218e0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
218f0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
21900 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
21910 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
21920 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
21930 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
21940 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
21950 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
21960 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
21970 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70   + (int)strlen(p
21980 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 23 65  DbFd->zPath);.#e
21990 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
219a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
219b0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
219c0 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
219d0 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
219e0 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
219f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21a00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
21a10 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
21a20 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
21a30 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
21a40 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
21a50 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
21a60 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
21a70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
21a80 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
21a90 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
21aa0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
21ab0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
21ac0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21ad0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
21ae0 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b00 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
21b10 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
21b20 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b40 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
21b50 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
21b60 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
21b70 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
21b80 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
21b90 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
21ba0 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
21bb0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
21bc0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
21bd0 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
21be0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
21bf0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
21c00 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
21c10 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
21c20 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
21c30 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
21c40 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
21c50 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
21c60 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
21c70 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
21c80 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
21c90 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
21ca0 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
21cb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21cc0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21cd0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
21ce0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
21cf0 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
21d00 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
21d10 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67      int openFlag
21d20 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
21d30 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20  REAT;.      if( 
21d40 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
21d50 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ean(pDbFd->zPath
21d60 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22  , "readonly_shm"
21d70 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
21d80 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
21d90 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53  ONLY;.        pS
21da0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
21db0 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ly = 1;.      }.
21dc0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21dd0 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
21de0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70  zShmFilename, op
21df0 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e  enFlags, (sStat.
21e00 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a  st_mode&0777));.
21e10 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
21e20 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
21e30 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
21e40 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
21e50 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
21e60 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
21e70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
21e80 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
21e90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
21ea0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
21eb0 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
21ec0 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  t, make sure tha
21ed0 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20  t the SHM file. 
21ee0 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64       ** is owned
21ef0 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65   by the same use
21f00 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20  r that owns the 
21f10 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
21f20 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  e.  Otherwise,. 
21f30 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
21f40 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20  inal owner will 
21f50 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63  not be able to c
21f60 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f  onnect..      */
21f70 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e 28  .      osFchown(
21f80 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
21f90 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
21fa0 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
21fb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
21fc0 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
21fd0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
21fe0 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
21ff0 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
22000 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
22010 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
22020 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
22030 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
22040 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
22050 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
22060 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
22070 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
22080 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
22090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
220a0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
220b0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
220c0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
220d0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
220e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
220f0 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
22100 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
22110 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
22120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22140 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
22150 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
22160 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
22170 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
22180 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
22190 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
221a0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
221b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
221c0 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
221d0 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
221e0 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
221f0 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
22200 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
22210 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
22220 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
22230 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
22240 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
22250 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
22260 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
22270 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
22280 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
22290 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
222a0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
222b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
222c0 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
222d0 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
222e0 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
222f0 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
22300 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
22310 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
22320 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
22330 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
22340 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
22350 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
22360 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
22370 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
22380 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
22390 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
223a0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
223b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
223c0 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
223d0 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
223e0 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
223f0 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
22400 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
22410 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
22420 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
22430 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
22440 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
22450 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
22460 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
22470 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
22480 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
22490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
224a0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
224b0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
224c0 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
224d0 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
224e0 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
224f0 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
22500 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
22510 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
22520 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
22530 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
22540 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22550 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22560 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
22570 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
22580 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
22590 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
225a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
225b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
225c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
225d0 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
225e0 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
225f0 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
22600 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
22610 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
22620 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
22630 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
22640 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
22650 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22660 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
22670 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
22680 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
22690 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
226a0 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
226b0 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
226c0 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
226d0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
226e0 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
226f0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
22700 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
22710 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
22720 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
22730 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
22740 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
22750 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
22760 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
22770 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
22780 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
22790 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
227a0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
227b0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
227c0 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
227d0 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
227e0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
227f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
22800 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
22810 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
22820 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
22830 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
22840 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
22850 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
22860 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
22870 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
22880 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
22890 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
228a0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
228b0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
228c0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
228d0 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
228e0 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
228f0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
22900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22910 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
22920 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
22930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
22940 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
22950 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
22960 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
22990 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
229a0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
229b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
229c0 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
229d0 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
22a00 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
22a10 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
22a20 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
22a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22a40 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
22a50 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
22a60 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
22a70 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
22a80 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
22a90 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
22aa0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22ab0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22ac0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
22ad0 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  ry file has not 
22ae0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
22af0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
22b00 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53  .  if( pDbFd->pS
22b10 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  hm==0 ){.    rc 
22b20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64  = unixOpenShared
22b30 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
22b40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22b50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
22b60 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62  ;.  }..  p = pDb
22b70 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d  Fd->pShm;.  pShm
22b80 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
22b90 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  de;.  sqlite3_mu
22ba0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
22bb0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
22bc0 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
22bd0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
22be0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
22bf0 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
22c00 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
22c10 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
22c20 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
22c30 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
22c40 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
22c50 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
22c60 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
22c70 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
22c80 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
22c90 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
22ca0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
22cb0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
22cc0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  iRegion ){.    c
22cd0 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
22d00 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
22d10 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
22d20 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
22d30 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
22d40 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
22d50 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
22d60 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
22d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
22d80 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
22d90 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
22da0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
22db0 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
22dc0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
22dd0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
22de0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
22df0 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
22e00 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
22e10 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
22e20 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
22e30 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
22e40 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
22e50 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
22e60 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
22e70 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
22e80 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
22e90 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
22ea0 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
22eb0 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
22ec0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
22ed0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
22ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
22ef0 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
22f00 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
22f10 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
22f20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
22f30 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
22f40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22f50 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
22f60 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
22f70 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
22f80 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
22f90 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
22fa0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
22fb0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
22fc0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
22fd0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
22fe0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22ff0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
23000 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
23010 72 75 65 2c 20 75 73 65 20 66 74 72 75 6e 63 61  rue, use ftrunca
23020 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
23030 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
23040 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
23050 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 20   region..       
23060 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
23070 21 62 45 78 74 65 6e 64 20 29 20 67 6f 74 6f 20  !bExtend ) goto 
23080 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 23 69 66  shmpage_out;.#if
23090 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
230a0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
230b0 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
230c0 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 20 20 69  LOCATE.        i
230d0 66 28 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70  f( osFallocate(p
230e0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61  ShmNode->h, sSta
230f0 74 2e 73 74 5f 73 69 7a 65 2c 20 6e 42 79 74 65  t.st_size, nByte
23100 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23110 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
23120 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
23130 5f 53 48 4d 53 49 5a 45 2c 20 22 66 61 6c 6c 6f  _SHMSIZE, "fallo
23140 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20  cate",.         
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
23170 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
23180 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
23190 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  out;.        }.#
231a0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
231b0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
231c0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6e  e(pShmNode->h, n
231d0 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
231e0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
231f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
23200 52 5f 53 48 4d 53 49 5a 45 2c 20 22 66 74 72 75  R_SHMSIZE, "ftru
23210 6e 63 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  ncate",.        
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
23240 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
23250 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23260 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
23270 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
23280 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
23290 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
232a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
232b0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
232c0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
232d0 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
232e0 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
232f0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
23300 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
23310 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
23320 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
23330 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
23340 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
23350 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
23360 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
23370 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
23380 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
23390 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
233a0 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
233b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
233c0 6e 3c 3d 69 52 65 67 69 6f 6e 29 7b 0a 20 20 20  n<=iRegion){.   
233d0 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20     void *pMem;. 
233e0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
233f0 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20  e->h>=0 ){.     
23400 20 20 20 70 4d 65 6d 20 3d 20 6d 6d 61 70 28 30     pMem = mmap(0
23410 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20  , szRegion,.    
23420 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
23430 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
23440 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
23450 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
23460 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
23470 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
23480 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
23490 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
234a0 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
234b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
234c0 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
234d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
234e0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
234f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
23500 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
23510 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
23520 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23530 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
23540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
23550 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
23560 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
23570 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  c(szRegion);.   
23580 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30       if( pMem==0
23590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
235a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
235b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
235c0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
235d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
235e0 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
235f0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
23600 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
23610 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  ->apRegion[pShmN
23620 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 20 3d 20  ode->nRegion] = 
23630 70 4d 65 6d 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMem;.      pShm
23640 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b  Node->nRegion++;
23650 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
23660 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
23670 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23680 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
23690 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  *pp = pShmNode->
236a0 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  apRegion[iRegion
236b0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
236c0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  *pp = 0;.  }.  i
236d0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
236e0 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53  eadonly && rc==S
236f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
23700 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
23710 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23720 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
23730 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
23740 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
23750 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
23760 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
23770 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
23780 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
23790 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  t the relationsh
237a0 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ip between SHARE
237b0 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20  d and EXCLUSIVE 
237c0 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c  locks is a littl
237d0 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68  e.** different h
237e0 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69  ere than in posi
237f0 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28  x.  In xShmLock(
23800 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72  ), one can go fr
23810 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74  om unlocked.** t
23820 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63  o shared and bac
23830 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  k or from unlock
23840 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
23850 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f  and back.  But o
23860 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f  ne may.** not go
23870 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20   from shared to 
23880 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f  exclusive or fro
23890 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73  m exclusive to s
238a0 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hared..*/.static
238b0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
238c0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
238d0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
238e0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
238f0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
23900 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
23910 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
23920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23930 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
23940 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
23950 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23970 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
23980 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
23990 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
239a0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
239b0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
239c0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
239d0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ck */.){.  unixF
239e0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
239f0 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  ixFile*)fd;     
23a00 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
23a10 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
23a20 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68  mory */.  unixSh
23a30 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
23a40 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
23a50 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
23a60 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
23a70 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  d */.  unixShm *
23a80 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23aa0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
23ab0 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
23ac0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
23ad0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
23ae0 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20  hmNode;  /* The 
23af0 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
23b00 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iNode */.  int r
23b10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
23b40 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
23b70 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
23b80 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
23b90 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  /..  assert( pSh
23ba0 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
23bb0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
23bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23bd0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
23be0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
23bf0 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
23c00 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
23c10 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
23c20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
23c30 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
23c40 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
23c50 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
23c60 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
23c70 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
23c80 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
23c90 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
23ca0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
23cb0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
23cc0 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
23cd0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
23ce0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
23cf0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
23d00 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
23d10 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
23d20 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
23d30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
23d40 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
23d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23d60 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
23d70 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
23d80 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
23d90 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
23da0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
23db0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
23dc0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
23dd0 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
23de0 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
23df0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
23e00 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
23e10 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
23e20 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23e30 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23e40 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
23e50 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
23e60 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
23e70 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
23e80 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
23e90 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
23ea0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
23eb0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
23ec0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
23ed0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
23ee0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
23ef0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
23f00 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
23f10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23f20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
23f30 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
23f40 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
23f50 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
23f60 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
23f70 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
23f80 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
23f90 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
23fa0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
23fb0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
23fc0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
23fd0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
23fe0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
23ff0 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_UNLCK, ofst+U
24000 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
24010 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24020 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24030 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
24040 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
24050 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
24060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24070 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
24080 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
24090 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
240a0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
240b0 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
240c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
240d0 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
240e0 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
240f0 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
24100 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
24110 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
24120 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
24130 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
24140 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
24150 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
24160 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
24170 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
24180 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
24190 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
241a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
241b0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
241c0 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
241d0 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
241e0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
241f0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
24200 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
24210 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
24220 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
24230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
24240 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
24250 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24260 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
24270 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
24280 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
24290 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
242a0 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
242b0 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
242c0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
242d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
242e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
242f0 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
24300 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
24310 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
24320 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
24330 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
24340 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
24350 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24360 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24370 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
24380 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
24390 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
243a0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
243b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
243c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
243d0 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
243e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
243f0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
24400 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
24410 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
24420 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
24430 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
24440 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
24450 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
24460 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
24470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
24480 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
24490 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
244a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
244b0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
244c0 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
244d0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
244e0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
244f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24500 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
24510 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
24520 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
24530 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
24540 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
24550 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
24560 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
24570 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
24580 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
24590 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
245a0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
245b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
245c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
245d0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
245e0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52  k(pShmNode, F_WR
245f0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
24600 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
24610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24630 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
24640 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
24650 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
24660 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
24670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24680 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
24690 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
246a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
246b0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
246c0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
246d0 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
246e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
246f0 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c 20  ->id, getpid(), 
24700 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
24710 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
24720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24730 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
24740 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
24750 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
24760 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
24770 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
24780 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
24790 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
247a0 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
247b0 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
247c0 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
247d0 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
247e0 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
247f0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
24800 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
24810 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
24820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
24830 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
24840 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
24850 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
24860 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
24870 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d);.  unixEnterM
24880 75 74 65 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65  utex();.  unixLe
24890 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
248a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
248b0 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
248c0 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
248d0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
248e0 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
248f0 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
24900 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
24910 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
24920 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
24930 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
24940 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
24950 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
24960 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
24970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
24980 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
24990 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
249b0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
249c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
249d0 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
249e0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
249f0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
24a00 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
24a10 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
24a20 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
24a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
24a50 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
24a60 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
24a70 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
24a80 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
24a90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
24aa0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
24ab0 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
24ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
24ad0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
24ae0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
24af0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
24b00 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
24b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
24b20 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
24b30 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
24b40 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
24b50 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
24b60 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
24b70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24b80 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
24b90 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
24ba0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24bb0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
24bc0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
24bd0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
24be0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
24bf0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
24c00 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
24c10 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
24c20 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
24c30 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
24c40 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
24c50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
24c60 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
24c70 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
24c80 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
24c90 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
24ca0 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
24cb0 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
24cc0 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
24cd0 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
24ce0 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
24cf0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
24d00 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
24d10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
24d20 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
24d30 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
24d40 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
24d50 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
24d60 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
24d70 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
24d80 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
24d90 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
24da0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
24db0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
24dc0 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
24dd0 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
24de0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
24df0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
24e00 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
24e10 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 6f  hmNode->h>=0 ) o
24e20 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65  sUnlink(pShmNode
24e30 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
24e40 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
24e50 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
24e60 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
24e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24e80 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
24e90 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
24ea0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
24eb0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
24ec0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
24ed0 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
24ee0 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
24ef0 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
24f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24f10 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
24f20 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
24f30 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
24f40 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
24f50 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
24f60 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
24f70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
24f80 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
24f90 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
24fa0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
24fb0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6d 75 6e  egion ){.    mun
24fc0 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67  map(pFd->pMapReg
24fd0 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 4f 72  ion, pFd->mmapOr
24fe0 69 67 73 69 7a 65 29 3b 0a 20 20 20 20 70 46 64  igsize);.    pFd
24ff0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
25000 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
25010 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64  ize = 0;.    pFd
25020 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 20 3d  ->mmapOrigsize =
25030 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
25040 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
25050 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
25060 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
25070 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
25080 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
25090 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
250a0 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
250b0 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
250c0 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
250d0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
250e0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
250f0 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
25100 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
25110 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
25120 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
25130 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
25140 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
25150 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
25160 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
25170 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
25180 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
25190 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
251a0 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
251b0 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
251c0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
251d0 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
251e0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
251f0 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
25200 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
25210 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
25220 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
25230 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
25240 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
25250 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
25260 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
25270 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
25280 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
25290 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
252a0 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65  MAP_SIZE, whiche
252b0 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
252c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
252d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
252e0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
252f0 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
25300 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
25310 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
25320 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
25330 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
25340 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
25350 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
25360 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
25370 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
25380 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
25390 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20  4 nByte){.  i64 
253a0 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20  nMap = nByte;.  
253b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
253c0 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
253d0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
253e0 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
253f0 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
25400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
25410 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
25420 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
25430 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
25440 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
25450 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
25460 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  /.    rc = osFst
25470 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74  at(pFd->h, &stat
25480 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
25490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
254a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
254b0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
254c0 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d      }.    nMap =
254d0 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
254e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
254f0 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20  >pFd->mmapLimit 
25500 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
25510 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3b 0a 20 20  d->mmapLimit;.  
25520 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70  }..  if( nMap!=p
25530 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
25540 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
25550 65 28 70 46 64 29 3b 0a 0a 20 20 20 20 69 66 28  e(pFd);..    if(
25560 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20   nMap>0 ){.     
25570 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
25580 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50     int flags = P
25590 52 4f 54 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  ROT_READ;.      
255a0 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
255b0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52  ags & UNIXFILE_R
255c0 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67  DONLY)==0 ) flag
255d0 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b  s |= PROT_WRITE;
255e0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  .      pNew = os
255f0 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 20 66 6c  Mmap(0, nMap, fl
25600 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
25610 20 70 46 64 2d 3e 68 2c 20 30 29 3b 0a 20 20 20   pFd->h, 0);.   
25620 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
25630 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
25640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25650 5f 49 4f 45 52 52 5f 4d 4d 41 50 3b 0a 20 20 20  _IOERR_MMAP;.   
25660 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 46 64 2d     }..      pFd-
25670 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e  >pMapRegion = pN
25680 65 77 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6d  ew;.      pFd->m
25690 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
256a0 20 20 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 4f        pFd->mmapO
256b0 72 69 67 73 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  rigsize = nMap;.
256c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
256d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
256e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69  ../*.** If possi
256f0 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ble, return a po
25700 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
25710 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74  ng of file fd st
25720 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74  arting at offset
25730 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61  .** iOff. The ma
25740 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61  pping must be va
25750 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  lid for at least
25760 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a   nAmt bytes..**.
25770 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69  ** If such a poi
25780 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61  nter can be obta
25790 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69  ined, store it i
257a0 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e  n *pp and return
257b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
257c0 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  r, if one cannot
257d0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
257e0 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f  curs, set *pp to
257f0 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51   0 and return SQ
25800 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61  LITE_OK..** Fina
25810 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
25820 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
25830 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
25840 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
25850 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
25860 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64  *pp is undefined
25870 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
25880 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
25890 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72  ction does retur
258a0 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  n a pointer, the
258b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65   caller must eve
258c0 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65  ntually .** rele
258d0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
258e0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69  e by calling uni
258f0 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  xUnfetch()..*/.s
25900 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65  tatic int unixFe
25910 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
25920 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
25930 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
25940 2a 70 70 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *pp){.  unixFile
25950 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
25960 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
25970 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
25980 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 2a  base file */.  *
25990 70 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  pp = 0;..  if( p
259a0 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3e 30 20  Fd->mmapLimit>0 
259b0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
259c0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
259d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
259e0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c  unixMapfile(pFd,
259f0 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
25a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
25a20 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
25a30 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
25a40 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
25a50 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
25a60 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
25a70 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
25a80 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
25a90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25aa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25ab0 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
25ac0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
25ad0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
25ae0 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
25af0 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65   a .** reference
25b00 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
25b10 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
25b20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65  unixFetch(). The
25b30 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
25b40 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
25b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
25b60 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
25b70 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
25b80 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68  g.** argument th
25b90 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  at was passed to
25ba0 20 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29   the unixFetch()
25bb0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a   invocation. .**
25bc0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
25bd0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
25be0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
25bf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
25c00 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f  ng called .** to
25c10 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20   inform the VFS 
25c20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f  layer that, acco
25c30 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20  rding to POSIX, 
25c40 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  any existing map
25c50 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77  ping .** may now
25c60 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
25c70 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
25c80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
25c90 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71  t unixUnfetch(sq
25ca0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
25cb0 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
25cc0 70 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  p){.  unixFile *
25cd0 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  pFd = (unixFile 
25ce0 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
25cf0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
25d00 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  se file */..  /*
25d10 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
25d20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
25d30 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
25d40 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
25d50 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
25d60 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
25d70 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
25d80 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
25d90 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
25da0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
25db0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
25dc0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
25dd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
25de0 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
25df0 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
25e00 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
25e10 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
25e20 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
25e30 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
25e40 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
25e50 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
25e60 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
25e70 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
25e80 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
25e90 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
25ea0 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
25eb0 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
25ec0 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  Out>=0 );.  retu
25ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25ee0 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
25ef0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
25f00 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
25f10 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
25f20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
25f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
25f40 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
25f50 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
25f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f70 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
25f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25fc0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
25fd0 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
25fe0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  s definitions of
25ff0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
26000 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74  ods objects that
26010 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61  .** implement va
26020 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69  rious file locki
26030 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
26040 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  It also contains
26050 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
26060 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  of "finder" func
26070 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72  tions.  A finder
26080 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65  -function is use
26090 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
260a0 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73  appropriate.** s
260b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
260c0 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70  s object for a p
260d0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
260e0 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41  se file.  The pA
260f0 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20  ppData.** field 
26100 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  of the sqlite3_v
26110 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61  fs VFS objects a
26120 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
26130 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  o be pointers to
26140 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
26150 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
26160 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a  for that VFS..**
26170 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20  .** Most finder 
26180 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
26190 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
261a0 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f  fixed sqlite3_io
261b0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
261c0 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e  ct.  The only in
261d0 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72  teresting finder
261e0 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74  -function is aut
261f0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77  olockIoFinder, w
26200 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74  hich.** looks at
26210 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
26220 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74  type and tries t
26230 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74  o guess the best
26240 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61   locking.** stra
26250 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a  tegy from that..
26260 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72  **.** For finder
26270 2d 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20  -funtion F, two 
26280 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
26290 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ted:.**.**    (1
262a0 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65  ) The real finde
262b0 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  r-function named
262c0 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a   "FImpt()"..**.*
262d0 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74  *    (2) A const
262e0 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ant pointer to t
262f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  his function nam
26300 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a  ed just "F"..**.
26310 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
26320 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72  to the F pointer
26330 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
26340 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66  pAppData value f
26350 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74  or VFS.** object
26360 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  s.  We have to d
26370 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f  o this instead o
26380 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61  f letting pAppDa
26390 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65  ta point.** dire
263a0 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64  ctly at the find
263b0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63  er-function sinc
263c0 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76  e C90 rules prev
263d0 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66  ent a void*.** f
263e0 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f  rom be cast into
263f0 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
26400 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61  ter..**.**.** Ea
26410 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
26420 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61  his macro genera
26430 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a  tes two objects:
26440 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f  .**.**   *  A co
26450 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69  nstant sqlite3_i
26460 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
26470 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61   call METHOD tha
26480 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  t has locking.**
26490 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c        methods CL
264a0 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
264b0 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a  K, CKRESLOCK..**
264c0 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20  .**   *  An I/O 
264d0 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
264e0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49  nction called FI
264f0 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e  NDER that return
26500 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20  s a pointer.**  
26510 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f      to the METHO
26520 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  D object in the 
26530 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e  previous bullet.
26540 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45  .*/.#define IOME
26550 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45  THODS(FINDER, ME
26560 54 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43  THOD, VERSION, C
26570 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f  LOSE, LOCK, UNLO
26580 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20  CK, CKLOCK)     
26590 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
265a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
265b0 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20  ds METHOD = {   
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20  \.   VERSION,   
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26630 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20  .   CLOSE,      
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20  /* xClose */    
26660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
26680 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20     unixRead,    
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266a0 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20  * xRead */      
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
266d0 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20    unixWrite,    
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
266f0 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20   xWrite */      
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
26720 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20   unixTruncate,  
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26740 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20  xTruncate */    
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
26770 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20  unixSync,       
26780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26790 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20  Sync */         
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
267c0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  nixFileSize,    
267d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
267e0 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  ileSize */      
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26800 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f           \.   LO
26810 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
26820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
26830 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26850 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c          \.   UNL
26860 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
26870 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
26880 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f         \.   CKLO
268b0 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
268c0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
268d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268f0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
26900 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
26910 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
26920 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20  ontrol */       
26930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26940 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65       \.   unixSe
26950 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
26960 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
26970 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26990 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76      \.   unixDev
269a0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
269b0 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
269c0 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20  apabilities */  
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d     \.   unixShmM
269f0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
26a00 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
26a10 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f    \.   unixShmLo
26a40 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
26a50 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
26a60 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72   \.   unixShmBar
26a90 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
26aa0 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
26ab0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61  \.   unixShmUnma
26ae0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26af0 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
26b20 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20  .   unixFetch,  
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20  /* xFetch */    
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
26b70 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20     unixUnfetch, 
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b90 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20  * xUnfetch */   
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
26bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
26c10 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
26c20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
26c30 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
26c40 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
26c50 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
26c60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
26c70 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
26c80 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
26cb0 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
26d50 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
26d60 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
26d70 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
26d80 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
26d90 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
26da0 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
26db0 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
26dc0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
26dd0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
26de0 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
26df0 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
26e00 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
26e10 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
26e20 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
26e30 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
26e40 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
26e50 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
26e60 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
26e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
26e80 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
26e90 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
26ea0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
26eb0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
26ec0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
26ed0 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
26f00 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20  ry and mmap are 
26f10 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
26f20 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
26f30 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
26f40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
26f50 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
26f60 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
26f70 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
26f80 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
26f90 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
26fa0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
26fb0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
26fc0 63 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck     /* xCheck
26fd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
26fe0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
26ff0 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
27000 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
27010 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
27020 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
27030 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
27040 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
27050 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27060 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27080 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
27090 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
270a0 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  bled */.  nolock
270b0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
270c0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
270d0 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
270e0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
270f0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
27100 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
27110 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
27120 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
27130 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
27140 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
27150 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
27160 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
27170 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
27180 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
27190 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
271a0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
271b0 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
271c0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
271d0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
271e0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
271f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
27220 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
27230 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
27240 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
27250 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
27260 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
27270 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
27280 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
27290 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
272a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
272b0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
272c0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
272d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
272e0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
272f0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
27300 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
27310 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
27320 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
27330 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
27340 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
27350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
27360 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
27370 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
27380 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
27390 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
273a0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
273b0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273d0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
273e0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
273f0 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27410 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
27420 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27440 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
27450 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27470 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
27480 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
27490 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a  servedLock    /*
274a0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
274b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
274c0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
274d0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
274e0 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27500 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
27510 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
27520 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
27530 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
27540 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27550 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27570 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
27580 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
27590 65 64 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65  ed */.  semClose
275a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
275b0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
275c0 6f 64 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c  od */.  semLock,
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275e0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
275f0 64 20 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b  d */.  semUnlock
27600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27610 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
27620 6f 64 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b  od */.  semCheck
27630 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20  ReservedLock    
27640 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
27650 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
27660 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
27670 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
27680 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
27690 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
276a0 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
276b0 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
276c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
276d0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
276e0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
276f0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
27700 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
27710 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
27720 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
27750 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
27760 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27780 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
27790 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
277b0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
277c0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
277d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
277e0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
277f0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
27800 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
27810 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
27820 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
27830 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
27840 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
27850 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
27860 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
27870 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
27880 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
27890 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
278a0 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
278b0 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
278c0 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
278d0 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
278e0 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
278f0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
27900 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
27910 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
27920 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
27930 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
27940 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
27950 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
27960 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
27970 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
27980 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
27990 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
279a0 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
279b0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
279c0 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
279d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
279e0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
279f0 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
27a00 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
27a10 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
27a20 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
27a30 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
27a40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
27a50 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
27a60 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
27a70 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
27a80 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
27a90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
27aa0 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
27ab0 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
27ac0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
27ad0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
27ae0 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
27af0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
27b00 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
27b10 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
27b20 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
27b30 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
27b40 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
27b50 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
27b60 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
27b70 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
27b80 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
27b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
27bb0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
27bc0 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
27bd0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
27be0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
27bf0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
27c00 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
27c10 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
27c20 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
27c30 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
27c40 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
27c50 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
27c60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
27c70 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
27c80 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
27c90 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
27ca0 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
27cb0 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
27cc0 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
27cd0 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
27ce0 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
27cf0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
27d00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
27d10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
27d20 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
27d30 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
27d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27d50 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
27d60 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
27d70 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
27d80 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
27d90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
27da0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
27dd0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
27de0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
27df0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27e00 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
27e10 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
27e20 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
27e30 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
27e40 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
27e50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
27e60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
27e70 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
27e80 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
27e90 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
27ea0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
27eb0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
27ec0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
27ed0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
27ee0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
27ef0 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
27f00 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
27f10 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
27f20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
27f30 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
27f40 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
27f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
27f60 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
27f70 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
27f80 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27f90 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
27fa0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
27fb0 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
27fc0 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
27fd0 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
27fe0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
27ff0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
28000 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
28010 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
28020 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
28030 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
28040 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
28050 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
28060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
28070 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
28080 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
28090 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
280a0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
280b0 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
280c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
280d0 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
280e0 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
280f0 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
28100 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
28110 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
28120 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
28130 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
28140 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
28150 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
28160 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
28170 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
28180 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
28190 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
281a0 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
281b0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
281c0 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
281d0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
281e0 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
281f0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
28200 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
28210 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
28220 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
28230 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
28240 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
28250 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
28260 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
28270 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
28280 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
28290 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
282a0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
282b0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
282c0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
282d0 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
282e0 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
282f0 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
28300 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
28310 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
28320 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
28330 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
28340 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
28350 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
28360 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
28370 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
28380 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
28390 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
283a0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
283b0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
283c0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
283d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
283e0 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
283f0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
28400 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28410 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
28420 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
28430 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
28440 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
28450 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
28460 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
28470 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
28480 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
28490 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
284a0 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
284b0 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
284c0 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
284d0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
284e0 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
284f0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
28500 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
28510 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
28520 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
28530 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
28540 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
28550 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
28560 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
28570 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
28580 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
28590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
285a0 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
285b0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
285c0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
285d0 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
285e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
285f0 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
28600 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
28610 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
28620 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
28630 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
28640 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
28650 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
28660 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
28670 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
28680 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
28690 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
286a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
286b0 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
286c0 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c 49 54  VXWORKS && SQLIT
286d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
286e0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
286f0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
28700 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
28710 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
28720 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
28730 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
28740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
28750 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
28760 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
28770 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28780 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
28790 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
287a0 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
287b0 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 56 58  * This is for VX
287c0 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  Works only..*/.s
287d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
287e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
287f0 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
28800 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
28810 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
28820 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
28830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
28840 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
28850 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  w           /* t
28860 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  he open file obj
28870 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
28880 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
28890 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
288a0 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
288b0 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
288c0 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
288d0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
288e0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
288f0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
28900 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
28910 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
28920 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
28930 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f  ethods;.  }..  /
28940 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28  * Test if fcntl(
28950 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61  ) is supported a
28960 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79  nd use POSIX sty
28970 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f  le locks..  ** O
28980 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61  therwise fall ba
28990 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20  ck to the named 
289a0 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64  semaphore method
289b0 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66  ..  */.  lockInf
289c0 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c  o.l_len = 1;.  l
289d0 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20  ockInfo.l_start 
289e0 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 0;.  lockInfo.
289f0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
28a00 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  SET;.  lockInfo.
28a10 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
28a20 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28  ;.  if( osFcntl(
28a30 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
28a40 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
28a50 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   ) {.    return 
28a60 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
28a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
28a80 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f  turn &semIoMetho
28a90 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ds;.  }.}.static
28aa0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
28ab0 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a  o_methods .  *(*
28ac0 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f  const autolockIo
28ad0 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
28ae0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
28af0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
28b00 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
28b10 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  * OS_VXWORKS && 
28b20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
28b30 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
28b40 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
28b50 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
28b60 6e 74 65 72 20 74 6f 20 61 20 49 4f 20 6d 65 74  nter to a IO met
28b70 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74  hod finder funct
28b80 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion:.*/.typedef 
28b90 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
28ba0 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64  _methods *(*find
28bb0 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63  er_type)(const c
28bc0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b  har*,unixFile*);
28bd0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
28be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c20 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
28c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
28c40 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
28c50 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
28c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
28c70 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
28c80 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
28c90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
28ca0 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
28cb0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
28cc0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
28cd0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
28ce0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
28cf0 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
28d00 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
28d10 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  y pId..*/.static
28d20 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46   int fillInUnixF
28d30 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ile(.  sqlite3_v
28d40 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
28d50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
28d60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
28d70 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
28d80 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
28d90 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20  e descriptor of 
28da0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
28db0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
28dc0 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f  ile *pId,      /
28dd0 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75  * Write to the u
28de0 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
28df0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
28e00 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
28e10 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
28e20 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
28e30 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74  ened */.  int ct
28e40 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  rlFlags         
28e50 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
28e60 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c  e UNIXFILE_* val
28e70 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ues */.){.  cons
28e80 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28e90 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74  hods *pLockingSt
28ea0 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
28eb0 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c  *pNew = (unixFil
28ec0 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72  e *)pId;.  int r
28ed0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28ee0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
28ef0 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a  pInode==NULL );.
28f00 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68  .  /* Usually th
28f10 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65  e path zFilename
28f20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
28f30 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
28f40 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63  me. The.  ** exc
28f50 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f  eption is when o
28f60 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79  pening the proxy
28f70 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e   "conch" file in
28f80 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a   builds that.  *
28f90 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70  * include the sp
28fa0 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b  ecial Apple lock
28fb0 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f  ing styles..  */
28fc0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
28fd0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
28fe0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28ff0 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28  _STYLE.  assert(
29000 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
29010 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27   zFilename[0]=='
29020 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d  /' .    || pVfs-
29030 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64  >pAppData==(void
29040 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  *)&autolockIoFin
29050 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61  der );.#else.  a
29060 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
29070 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
29080 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64  [0]=='/' );.#end
29090 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b  if..  /* No lock
290a0 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65  ing occurs in te
290b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
290c0 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
290d0 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c  name!=0 || (ctrl
290e0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
290f0 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a  _NOLOCK)!=0 );..
29100 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
29110 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
29120 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  h, zFilename));.
29130 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20    pNew->h = h;. 
29140 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56   pNew->pVfs = pV
29150 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74  fs;.  pNew->zPat
29160 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
29170 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
29180 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73   = (u8)ctrlFlags
29190 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
291a0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74  uri_boolean(((ct
291b0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
291c0 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e  LE_URI) ? zFilen
291d0 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20  ame : 0),.      
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c       "psow", SQL
29200 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
29210 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
29220 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
29230 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  |= UNIXFILE_PSOW
29240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
29250 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
29260 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29  unix-excl")==0 )
29270 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
29280 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
29290 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66  E_EXCL;.  }..#if
292a0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
292b0 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
292c0 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
292d0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
292e0 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
292f0 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
29300 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
29310 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29320 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
29330 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61  f..  if( ctrlFla
29340 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
29350 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  LOCK ){.    pLoc
29360 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
29370 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
29380 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
29390 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
293a0 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
293b0 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
293c0 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
293d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
293e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
293f0 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
29400 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
29410 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
29420 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
29430 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
29440 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
29450 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
29460 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
29470 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
29480 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
29490 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
294a0 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
294b0 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
294c0 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
294d0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
294e0 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
294f0 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
29500 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
29510 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
29520 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
29530 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29540 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29550 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
29560 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
29570 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
29580 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b  hods.#endif.  ){
29590 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
295a0 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
295b0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
295c0 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
295d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
295e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
295f0 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
29600 72 20 6f 63 63 75 72 65 64 20 69 6e 20 66 69 6e  r occured in fin
29610 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c  dInodeInfo(), cl
29620 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ose the file des
29630 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a  criptor.      **
29640 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65   immediately, be
29650 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74  fore releasing t
29660 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e  he mutex. findIn
29670 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61  odeInfo() may fa
29680 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  il.      ** in t
29690 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20  wo scenarios:.  
296a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
296b0 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20    (a) A call to 
296c0 66 73 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a  fstat() failed..
296d0 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41        **   (b) A
296e0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a   malloc failed..
296f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
29700 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d  * Scenario (b) m
29710 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  ay only occur if
29720 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20   the process is 
29730 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72  holding no other
29740 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64  .      ** file d
29750 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20  escriptors open 
29760 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  on the same file
29770 2e 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  . If there were 
29780 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20  other file.     
29790 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20   ** descriptors 
297a0 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  on this file, th
297b0 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75  en no malloc wou
297c0 6c 64 20 62 65 20 72 65 71 75 69 72 65 64 20 62  ld be required b
297d0 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49  y.      ** findI
297e0 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74  nodeInfo(). If t
297f0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
29800 20 69 74 20 69 73 20 71 75 69 74 65 20 73 61 66   it is quite saf
29810 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20  e to close.     
29820 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61   ** handle h - a
29830 73 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  s it is guarante
29840 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78  ed that no posix
29850 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72   locks will be r
29860 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a  eleased.      **
29870 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20   by doing so..  
29880 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
29890 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20  If scenario (a) 
298a0 63 61 75 73 65 64 20 74 68 65 20 65 72 72 6f 72  caused the error
298b0 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65   then things are
298c0 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68   not so safe. Th
298d0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69  e.      ** impli
298e0 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68  cit assumption h
298f0 65 72 65 20 69 73 20 74 68 61 74 20 69 66 20 66  ere is that if f
29900 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68  stat() fails, th
29910 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20  ings are in.    
29920 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68    ** such bad sh
29930 61 70 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e  ape that droppin
29940 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20  g a lock or two 
29950 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d  doesn't matter m
29960 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  uch..      */.  
29970 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
29980 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
29990 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d  __);.      h = -
299a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69  1;.    }.    uni
299b0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
299c0 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   }..#if SQLITE_E
299d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
299e0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
299f0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65  _APPLE__).  else
29a00 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
29a10 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  le == &afpIoMeth
29a20 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46  ods ){.    /* AF
29a30 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  P locking uses t
29a40 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
29a50 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
29a60 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a  ncluded in.    *
29a70 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * the afpLocking
29a80 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a  Context..    */.
29a90 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f      afpLockingCo
29aa0 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20  ntext *pCtx;.   
29ab0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
29ac0 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73  ntext = pCtx = s
29ad0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
29ae0 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
29af0 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
29b00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
29b10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
29b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
29b30 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
29b40 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
29b50 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
29b60 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
29b70 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
29b80 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
29b90 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
29ba0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
29bb0 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
29bc0 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
29bd0 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
29be0 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
29bf0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
29c00 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
29c10 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
29c20 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
29c30 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
29c40 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
29c50 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
29c60 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
29c70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29c90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
29ca0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
29cb0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
29cc0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
29cd0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
29ce0 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
29cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
29d00 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
29d10 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
29d20 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
29d30 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
29d40 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
29d50 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
29d60 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
29d70 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
29d80 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
29d90 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
29da0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
29db0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
29dc0 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
29dd0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
29de0 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
29df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ;.    assert( zF
29e00 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ilename!=0 );.  
29e10 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
29e20 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
29e30 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
29e40 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
29e50 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
29e60 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
29e70 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
29e80 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
29e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
29ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
29eb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29ec0 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
29ed0 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
29ee0 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
29ef0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
29f00 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
29f10 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
29f20 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
29f30 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
29f40 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
29f50 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
29f60 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
29f70 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
29f80 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
29f90 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
29fa0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
29fb0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
29fc0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
29fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
29fe0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
29ff0 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2a000 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2a010 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2a020 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2a030 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2a040 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2a050 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2a060 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2a070 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2a080 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2a090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2a0a0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2a0b0 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2a0c0 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2a0f0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2a100 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2a110 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2a120 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2a130 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2a140 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2a150 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2a160 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2a170 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2a180 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2a190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2a1a0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2a1b0 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2a1c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a1d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2a1e0 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
2a1f0 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
2a200 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
2a210 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2a220 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2a230 6e 64 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e  ndif.  .  pNew->
2a240 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23  lastErrno = 0;.#
2a250 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2a260 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a270 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2a280 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2a290 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2a2a0 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
2a2b0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46  .    osUnlink(zF
2a2c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
2a2d0 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
2a2e0 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
2a2f0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2a300 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
2a310 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ETE;.#endif.  if
2a320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a330 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2a340 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2a350 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2a360 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a370 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2a380 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2a390 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2a3a0 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
2a3b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2a3c0 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
2a3d0 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20   a directory in 
2a3e0 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d  which to put tem
2a3f0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
2a400 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
2a410 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64  temporary file d
2a420 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20  irectory can be 
2a430 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55  found, return NU
2a440 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
2a450 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
2a460 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b  mpFileDir(void){
2a470 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2a480 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
2a490 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
2a4a0 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
2a4b0 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
2a4c0 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
2a4d0 2c 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20  ,.     0        
2a4e0 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74  /* List terminat
2a4f0 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73  or */.  };.  uns
2a500 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2a510 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2a520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2a530 69 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72  ir = 0;..  azDir
2a540 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
2a550 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
2a560 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
2a570 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
2a580 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
2a590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
2a5a0 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
2a5b0 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
2a5c0 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
2a5d0 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  {.    if( zDir==
2a5e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2a5f0 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69    if( osStat(zDi
2a600 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  r, &buf) ) conti
2a610 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
2a620 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
2a630 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2a640 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28     if( osAccess(
2a650 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74  zDir, 07) ) cont
2a660 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b  inue;.    break;
2a670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44  .  }.  return zD
2a680 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ir;.}../*.** Cre
2a690 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2a6a0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2a6b0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2a6c0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2a6d0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2a6e0 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2a6f0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2a700 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2a710 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a720 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2a730 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2a740 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2a750 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
2a760 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
2a770 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73  gned char zChars
2a780 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
2a790 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2a7a0 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
2a7b0 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
2a7c0 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
2a7d0 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67  456789";.  unsig
2a7e0 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ned int i, j;.  
2a7f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2a800 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
2a810 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2a820 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2a830 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2a840 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2a850 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2a860 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2a870 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2a880 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2a890 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2a8a0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
2a8b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2a8c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a8d0 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2a8e0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2a8f0 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2a900 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a   ) zDir = ".";..
2a910 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2a920 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
2a930 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
2a940 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
2a950 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
2a960 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
2a970 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
2a980 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
2a990 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29  f( (strlen(zDir)
2a9a0 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45   + strlen(SQLITE
2a9b0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2a9c0 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a  X) + 18) >= (siz
2a9d0 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20  e_t)nBuf ){.    
2a9e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2a9f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a  ROR;.  }..  do{.
2aa00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2aa10 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42  intf(nBuf-18, zB
2aa20 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f  uf, "%s/"SQLITE_
2aa30 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2aa40 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
2aa50 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
2aa60 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  f);.    sqlite3_
2aa70 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
2aa80 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  zBuf[j]);.    fo
2aa90 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
2aaa0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42  , j++){.      zB
2aab0 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
2aac0 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
2aad0 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
2aae0 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
2aaf0 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ) ];.    }.    z
2ab00 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[j] = 0;.    
2ab10 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
2ab20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73   }while( osAcces
2ab30 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
2ab40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ab50 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
2ab60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2ab70 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
2ab80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a  d(__APPLE__)./*.
2ab90 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72  ** Routine to tr
2aba0 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69  ansform a unixFi
2abb0 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d  le into a proxy-
2abc0 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65  locking unixFile
2abd0 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  ..** Implementat
2abe0 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79  ion in the proxy
2abf0 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20  -lock division, 
2ac00 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78  but used by unix
2ac10 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c  Open().** if SQL
2ac20 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
2ac30 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69  _LOCKING is defi
2ac40 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2ac50 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72  nt proxyTransfor
2ac60 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  mUnixFile(unixFi
2ac70 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  le*, const char*
2ac80 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  );.#endif../*.**
2ac90 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   Search for an u
2aca0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
2acb0 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f  iptor that was o
2acc0 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  pened on the dat
2acd0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28  abase .** file (
2ace0 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72  not a journal or
2acf0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
2ad00 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64  file) identified
2ad10 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20   by pathname.** 
2ad20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54  zPath with SQLIT
2ad30 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
2ad40 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20   matching those 
2ad50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2ad60 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
2ad70 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2ad80 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20  n..**.** Such a 
2ad90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ada0 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64  may exist if a d
2adb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2adc0 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a  on was closed.**
2add0 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61   but the associa
2ade0 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  ted file descrip
2adf0 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tor could not be
2ae00 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20   closed because 
2ae10 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69  some.** other fi
2ae20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
2ae30 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
2ae40 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ile is holding a
2ae50 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52   file-lock..** R
2ae60 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73  efer to comments
2ae70 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73   in the unixClos
2ae80 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  e() function and
2ae90 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d   the lengthy com
2aea0 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69  ment.** describi
2aeb0 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f  ng "Posix Adviso
2aec0 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74  ry Locking" at t
2aed0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
2aee0 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75   file for .** fu
2aef0 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41  rther details. A
2af00 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31  lso, ticket #401
2af10 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75  8..**.** If a su
2af20 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  itable file desc
2af30 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c  riptor is found,
2af40 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75   then it is retu
2af50 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73  rned. If no.** s
2af60 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
2af70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20  tor is located, 
2af80 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
2af90 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e  */.static UnixUn
2afa0 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73  usedFd *findReus
2afb0 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61  ableFd(const cha
2afc0 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c  r *zPath, int fl
2afd0 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73  ags){.  UnixUnus
2afe0 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
2aff0 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  0;..  /* Do not 
2b000 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  search for an un
2b010 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2b020 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  ptor on vxworks.
2b030 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a   Not because.  *
2b040 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20  * vxworks would 
2b050 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d  not benefit from
2b060 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20   the change (it 
2b070 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74  might, we're not
2b080 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74   sure),.  ** but
2b090 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20   because no way 
2b0a0 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75  to test it is cu
2b0b0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
2b0c0 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20  e. It is better 
2b0d0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73  .  ** not to ris
2b0e0 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72  k breaking vxwor
2b0f0 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74  ks support for t
2b100 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20  he sake of such 
2b110 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a  an obscure .  **
2b120 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69   feature.  */.#i
2b130 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
2b140 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
2b150 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2b160 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
2b170 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a  of stat() call *
2b180 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  /..  /* A stat()
2b190 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
2b1a0 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
2b1b0 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
2b1c0 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
2b1d0 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
2b1e0 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
2b1f0 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
2b200 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
2b210 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
2b220 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
2b230 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
2b240 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
2b250 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
2b260 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
2b270 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
2b280 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
2b290 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
2b2a0 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
2b2b0 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
2b2c0 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
2b2d0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2b2e0 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
2b2f0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
2b300 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
2b310 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
2b320 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
2b330 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
2b340 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
2b350 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65 20   resusable file 
2b360 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e  descriptor are n
2b370 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69  ot dire.  */.  i
2b380 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  f( 0==osStat(zPa
2b390 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  th, &sStat) ){. 
2b3a0 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f     unixInodeInfo
2b3b0 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75   *pInode;..    u
2b3c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2b3d0 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  .    pInode = in
2b3e0 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69  odeList;.    whi
2b3f0 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70  le( pInode && (p
2b400 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65  Inode->fileId.de
2b410 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a  v!=sStat.st_dev.
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e       || pInode->
2b440 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61  fileId.ino!=sSta
2b450 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20  t.st_ino) ){.   
2b460 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
2b470 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
2b480 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  }.    if( pInode
2b490 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e   ){.      UnixUn
2b4a0 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20  usedFd **pp;.   
2b4b0 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64     for(pp=&pInod
2b4c0 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20  e->pUnused; *pp 
2b4d0 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21  && (*pp)->flags!
2b4e0 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70  =flags; pp=&((*p
2b4f0 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
2b500 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70     pUnused = *pp
2b510 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e 75  ;.      if( pUnu
2b520 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  sed ){.        *
2b530 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e  pp = pUnused->pN
2b540 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2b550 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2b560 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2b570 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
2b580 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
2b590 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
2b5a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b5b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2b5c0 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20  y unixOpen() to 
2b5d0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e  determine the un
2b5e0 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a  ix permissions.*
2b5f0 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20  * to create new 
2b600 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e  files with. If n
2b610 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2b620 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
2b630 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
2b640 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62  d a value suitab
2b650 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61  le for passing a
2b660 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
2b670 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20  ment to open(2) 
2b680 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
2b690 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49   *pMode. If an I
2b6a0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
2b6b0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2b6c0 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
2b6d0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2b6e0 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20  ue of *pMode is 
2b6f0 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  not modified..**
2b700 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  .** In most case
2b710 73 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f  s cases, this ro
2b720 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64  utine sets *pMod
2b730 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69  e to 0, which wi
2b740 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20  ll become.** an 
2b750 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f  indication to ro
2b760 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63  bust_open() to c
2b770 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75  reate the file u
2b780 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  sing.** SQLITE_D
2b790 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
2b7a0 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64  ISSIONS adjusted
2b7b0 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
2b7c0 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c  * But if the fil
2b7d0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
2b7e0 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
2b7f0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
2b800 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
2b810 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
2b820 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2b830 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
2b840 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
2b850 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
2b860 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
2b870 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
2b880 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
2b890 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
2b8a0 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
2b8b0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
2b8c0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
2b8d0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
2b8e0 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
2b8f0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2b900 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2b910 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
2b920 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
2b930 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
2b940 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
2b950 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
2b960 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
2b970 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
2b980 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
2b990 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
2b9a0 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
2b9b0 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
2b9c0 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
2b9d0 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
2b9e0 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
2b9f0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
2ba00 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
2ba10 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ba30 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
2ba40 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
2ba50 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
2ba60 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2ba70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2ba80 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
2ba90 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
2baa0 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
2bab0 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
2bac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2bad0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
2bae0 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
2baf0 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
2bb00 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2bb10 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
2bb20 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2bb30 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
2bb40 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
2bb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2bb60 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
2bb70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
2bb80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2bb90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2bba0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2bbb0 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b  */.  *pMode = 0;
2bbc0 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20  .  *pUid = 0;.  
2bbd0 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pGid = 0;.  if(
2bbe0 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
2bbf0 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
2bc00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2bc10 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
2bc20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
2bc30 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
2bc40 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
2bc50 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2bc80 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
2bc90 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  zDb */.    struc
2bca0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
2bcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2bcc0 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
2bcd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2bce0 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69  ..    /* zPath i
2bcf0 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41  s a path to a WA
2bd00 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  L or journal fil
2bd10 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
2bd20 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20   block derives. 
2bd30 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74     ** the path t
2bd40 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
2bd50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
2bd60 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20  rom zPath. This 
2bd70 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20  block handles.  
2bd80 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
2bd90 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e  ng naming conven
2bda0 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  tions:.    **.  
2bdb0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2bdc0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20   db>-journal".  
2bdd0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2bde0 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a   db>-wal".    **
2bdf0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2be00 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20  -journalNN".    
2be10 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2be20 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  b>-walNN".    **
2be30 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
2be40 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75   is a decimal nu
2be50 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d  mber. The NN nam
2be60 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
2be70 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20  .    ** used by 
2be80 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c  the test_multipl
2be90 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20  ex.c module..   
2bea0 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71   */.    nDb = sq
2beb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2bec0 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65  ath) - 1; .#ifde
2bed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2bee0 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68  8_3_NAMES.    wh
2bef0 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71  ile( nDb>0 && sq
2bf00 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61  lite3Isalnum(zPa
2bf10 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d  th[nDb]) ) nDb--
2bf20 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30  ;.    if( nDb==0
2bf30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d   || zPath[nDb]!=
2bf40 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c  '-' ) return SQL
2bf50 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
2bf60 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e    while( zPath[n
2bf70 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  Db]!='-' ){.    
2bf80 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20    assert( nDb>0 
2bf90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bfa0 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e   zPath[nDb]!='\n
2bfb0 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d  ' );.      nDb--
2bfc0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2bfd0 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a     memcpy(zDb, z
2bfe0 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20  Path, nDb);.    
2bff0 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b  zDb[nDb] = '\0';
2c000 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ..    if( 0==osS
2c010 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29  tat(zDb, &sStat)
2c020 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65   ){.      *pMode
2c030 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
2c040 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a   & 0777;.      *
2c050 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pUid = sStat.st_
2c060 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64  uid;.      *pGid
2c070 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b   = sStat.st_gid;
2c080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c090 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2c0a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
2c0b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
2c0c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2c0d0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
2c0e0 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
2c0f0 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  600;.  }.  retur
2c100 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
2c110 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
2c120 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
2c130 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
2c140 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
2c150 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
2c160 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
2c170 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
2c180 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2c190 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
2c1a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2c1b0 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
2c1c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
2c1d0 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
2c1e0 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
2c1f0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
2c200 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
2c210 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
2c220 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
2c230 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
2c240 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
2c250 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
2c260 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
2c270 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
2c280 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
2c290 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
2c2a0 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
2c2b0 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
2c2c0 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
2c2d0 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
2c2e0 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
2c2f0 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
2c300 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
2c310 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
2c320 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
2c330 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
2c340 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
2c350 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
2c360 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
2c370 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
2c380 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
2c390 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
2c3a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
2c3b0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
2c3c0 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
2c3d0 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
2c3e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2c3f0 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
2c400 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2c410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c420 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
2c430 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
2c440 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2c450 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2c460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2c470 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
2c480 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
2c490 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2c4a0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
2c4b0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
2c4c0 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
2c4d0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
2c4e0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2c4f0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
2c500 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
2c510 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
2c520 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c540 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
2c550 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
2c560 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
2c570 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
2c580 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
2c590 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5b0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2c5c0 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
2c5d0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
2c5e0 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
2c5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2c600 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
2c610 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54  en() */.  int eT
2c620 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
2c630 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
2c640 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
2c650 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b   */.  int noLock
2c660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c670 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2c680 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
2c690 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
2c6a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c6c0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
2c6d0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
2c6e0 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
2c6f0 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
2c700 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
2c710 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
2c720 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2c730 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
2c740 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
2c750 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
2c760 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2c770 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
2c780 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
2c790 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
2c7a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2c7b0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
2c7c0 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
2c7d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2c7e0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
2c7f0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
2c800 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2c810 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
2c820 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c830 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2c840 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
2c850 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2c860 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
2c870 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
2c880 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2c890 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
2c8a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2c8b0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2c8c0 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
2c8d0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
2c8e0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
2c8f0 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
2c900 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2c910 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
2c920 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
2c930 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
2c940 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
2c950 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
2c960 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
2c970 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
2c980 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
2c990 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
2c9a0 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
2c9b0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
2c9c0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
2c9d0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
2c9e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2c9f0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2ca00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ca10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2ca20 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
2ca30 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ca40 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
2ca50 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
2ca60 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
2ca70 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2ca80 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
2ca90 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
2caa0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
2cab0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
2cac0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
2cad0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
2cae0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
2caf0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
2cb00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2cb10 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
2cb20 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
2cb30 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
2cb40 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
2cb50 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
2cb60 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
2cb70 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
2cb80 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
2cb90 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
2cba0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
2cbb0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
2cbc0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
2cbd0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
2cbe0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
2cbf0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
2cc00 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
2cc10 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
2cc20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
2cc30 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
2cc40 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2cc50 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
2cc60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
2cc70 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
2cc80 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
2cc90 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
2cca0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
2ccb0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
2ccc0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
2ccd0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
2cce0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
2ccf0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
2cd00 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
2cd10 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
2cd20 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
2cd30 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
2cd40 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
2cd50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
2cd60 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
2cd70 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
2cd80 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
2cd90 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
2cda0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
2cdb0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
2cdc0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
2cdd0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2cde0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
2cdf0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
2ce00 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
2ce10 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2ce20 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
2ce30 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
2ce40 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
2ce50 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
2ce60 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2ce70 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2ce80 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2ce90 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2cea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
2ceb0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
2cec0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
2ced0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
2cee0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
2cef0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
2cf00 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
2cf10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2cf20 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
2cf30 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2cf40 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
2cf50 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2cf60 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2cf70 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2cf80 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
2cf90 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
2cfa0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2cfb0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
2cfc0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2cfd0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
2cfe0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
2cff0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2d000 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
2d010 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2d020 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
2d030 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2d040 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2d050 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
2d060 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2d070 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
2d080 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
2d090 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
2d0a0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
2d0b0 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
2d0c0 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2d0d0 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
2d0e0 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
2d0f0 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
2d100 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2d110 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65  c(sizeof(*pUnuse
2d120 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  d));.      if( !
2d130 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2d140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d150 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
2d160 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e      }.    p->pUn
2d170 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
2d180 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  .    /* Database
2d190 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
2d1a0 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
2d1b0 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
2d1c0 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49  e not.    ** URI
2d1d0 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
2d1e0 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
2d1f0 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
2d200 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ssed into.    **
2d210 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
2d220 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
2d230 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
2d240 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
2d250 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c  I) || zName[strl
2d260 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2d270 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  );..  }else if( 
2d280 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a  !zName ){.    /*
2d290 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c   If zName is NUL
2d2a0 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  L, the upper lay
2d2b0 65 72 20 69 73 20 72 65 71 75 65 73 74 69 6e 67  er is requesting
2d2c0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f   a temp file. */
2d2d0 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
2d2e0 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44 69 72  lete && !syncDir
2d2f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  );.    rc = unix
2d300 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  GetTempname(MAX_
2d310 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70  PATHNAME+2, zTmp
2d320 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
2d330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d340 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d350 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
2d360 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20   = zTmpname;..  
2d370 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74    /* Generated t
2d380 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
2d390 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f  es are always do
2d3a0 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
2d3b0 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ated.    ** for 
2d3c0 75 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75  use by sqlite3_u
2d3d0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20  ri_parameter(). 
2d3e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
2d3f0 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d  Name[strlen(zNam
2d400 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  e)+1]==0 );.  }.
2d410 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
2d420 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2d430 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2d440 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
2d450 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
2d460 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
2d470 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
2d480 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
2d490 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
2d4a0 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
2d4b0 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
2d4c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
2d4d0 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
2d4e0 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
2d4f0 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
2d500 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
2d510 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
2d520 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
2d530 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
2d540 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
2d550 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
2d560 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
2d570 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
2d580 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
2d590 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
2d5a0 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
2d5b0 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
2d5c0 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
2d5d0 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
2d5e0 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
2d5f0 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
2d600 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
2d610 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
2d620 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e     /* Permission
2d630 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65  s to create file
2d640 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64   with */.    uid
2d650 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20  _t uid;         
2d660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2d670 65 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  erid for the fil
2d680 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67  e */.    gid_t g
2d690 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2d6a0 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
2d6b0 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
2d6c0 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43  /.    rc = findC
2d6d0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
2d6e0 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65  ame, flags, &ope
2d6f0 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69  nMode, &uid, &gi
2d700 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
2d710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d720 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70     assert( !p->p
2d730 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20  Unused );.      
2d740 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
2d750 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
2d760 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2d770 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2d780 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L );.      retur
2d790 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2d7a0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
2d7b0 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67  (zName, openFlag
2d7c0 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20  s, openMode);.  
2d7d0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
2d7e0 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c  X   %-3d %s 0%o\
2d7f0 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f  n", fd, zName, o
2d800 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  penFlags));.    
2d810 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
2d820 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52  o!=EISDIR && isR
2d830 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
2d840 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
2d850 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
2d860 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
2d870 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2d880 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
2d890 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67  y. */.      flag
2d8a0 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
2d8b0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2d8c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2d8d0 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67  ;.      openFlag
2d8e0 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f  s &= ~(O_RDWR|O_
2d8f0 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c  CREAT);.      fl
2d900 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2d910 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2d920 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
2d930 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  O_RDONLY;.      
2d940 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
2d950 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
2d960 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
2d970 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
2d980 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2d990 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
2d9a0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2d9b0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2d9c0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
2d9d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
2d9e0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
2d9f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2da00 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
2da10 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
2da20 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69  ot and if creati
2da30 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63  ng a new rollbac
2da40 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  k.    ** journal
2da50 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65   or WAL file, se
2da60 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20  t the ownership 
2da70 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  of the journal o
2da80 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20  r WAL to be.    
2da90 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
2daa0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
2dab0 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
2dac0 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
2dad0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
2dae0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2daf0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20  OURNAL) ){.     
2db00 20 6f 73 46 63 68 6f 77 6e 28 66 64 2c 20 75 69   osFchown(fd, ui
2db10 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20  d, gid);.    }. 
2db20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e   }.  assert( fd>
2db30 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  =0 );.  if( pOut
2db40 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
2db50 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
2db60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
2db70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d  Unused ){.    p-
2db80 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  >pUnused->fd = f
2db90 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  d;.    p->pUnuse
2dba0 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
2dbb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
2dbc0 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
2dbd0 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
2dbe0 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65  h = zName;.#else
2dbf0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
2dc00 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
2dc10 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2dc20 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2dc30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
2dc40 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
2dc50 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
2dc60 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
2dc70 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2dc80 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
2dc90 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2dca0 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
2dcb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2dcc0 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66  YLE.  if( fstatf
2dcd0 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
2dce0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
2dcf0 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2dd00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
2dd10 6f 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  o;.    robust_cl
2dd20 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2dd30 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
2dd40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2dd50 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
2dd60 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
2dd70 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
2dd80 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2dd90 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2dda0 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2ddb0 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2ddc0 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2ddd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
2dde0 74 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65  t up appropriate
2ddf0 20 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20   ctrlFlags */.  
2de00 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20  if( isDelete )  
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
2de20 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2de30 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66  ILE_DELETE;.  if
2de40 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20  ( isReadonly )  
2de50 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
2de60 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2de70 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  E_RDONLY;.  if( 
2de80 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20  noLock )        
2de90 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
2dea0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2deb0 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79  NOLOCK;.  if( sy
2dec0 6e 63 44 69 72 20 29 20 20 20 20 20 20 20 20 20  ncDir )         
2ded0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
2dee0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49  s |= UNIXFILE_DI
2def0 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61  RSYNC;.  if( fla
2df00 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2df10 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73  _URI ) ctrlFlags
2df20 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49   |= UNIXFILE_URI
2df30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
2df40 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2df50 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52  LE.#if SQLITE_PR
2df60 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2df70 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79  NG.  isAutoProxy
2df80 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 1;.#endif.  i
2df90 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26  f( isAutoProxy &
2dfa0 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20  & (zPath!=NULL) 
2dfb0 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20  && (!noLock) && 
2dfc0 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20  pVfs->xOpen ){. 
2dfd0 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63     char *envforc
2dfe0 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  e = getenv("SQLI
2dff0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2e000 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e  OCKING");.    in
2e010 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a  t useProxy = 0;.
2e020 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
2e030 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
2e040 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63  NG==1 means forc
2e050 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f  e always use pro
2e060 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20  xy, 0 means .   
2e070 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72   ** never use pr
2e080 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  oxy, NULL means 
2e090 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f  use proxy for no
2e0a0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e  n-local files on
2e0b0 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ly.  */.    if( 
2e0c0 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29  envforce!=NULL )
2e0d0 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
2e0e0 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65   = atoi(envforce
2e0f0 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )>0;.    }else{.
2e100 20 20 20 20 20 20 69 66 28 20 73 74 61 74 66 73        if( statfs
2e110 28 7a 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  (zPath, &fsInfo)
2e120 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
2e130 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
2e140 74 68 65 20 63 6c 6f 73 65 28 66 64 29 20 63 61  the close(fd) ca
2e150 6c 6c 20 69 73 20 73 75 62 2d 6f 70 74 69 6d 61  ll is sub-optima
2e160 6c 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  l. If the file o
2e170 70 65 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  pened.        **
2e180 20 77 69 74 68 20 66 64 20 69 73 20 61 20 64 61   with fd is a da
2e190 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
2e1a0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
2e1b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65   connections ope
2e1c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
2e1d0 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
2e1e0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c  re currently hol
2e1f0 64 69 6e 67 20 61 64 76 69 73 6f 72 79 20 6c 6f  ding advisory lo
2e200 63 6b 73 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20  cks on it,.     
2e210 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63     ** then the c
2e220 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 28 29 20 77  all to close() w
2e230 69 6c 6c 20 63 61 6e 63 65 6c 20 74 68 6f 73 65  ill cancel those
2e240 20 6c 6f 63 6b 73 2e 20 49 6e 20 70 72 61 63 74   locks. In pract
2e250 69 63 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ice,.        ** 
2e260 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 74  we're assuming t
2e270 68 61 74 20 73 74 61 74 66 73 28 29 20 64 6f 65  hat statfs() doe
2e280 73 6e 27 74 20 66 61 69 6c 20 76 65 72 79 20 6f  sn't fail very o
2e290 66 74 65 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20  ften. At least. 
2e2a0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68         ** not wh
2e2b0 69 6c 65 20 6f 74 68 65 72 20 66 69 6c 65 20 64  ile other file d
2e2c0 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65  escriptors opene
2e2d0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  d by the same pr
2e2e0 6f 63 65 73 73 20 6f 6e 0a 20 20 20 20 20 20 20  ocess on.       
2e2f0 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 66 69 6c   ** the same fil
2e300 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20  e are working.  
2e310 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 61  */.        p->la
2e320 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
2e330 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2e340 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c  close(p, fd, __L
2e350 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20  INE__);.        
2e360 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2e370 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
2e380 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2e390 73 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  shed;.      }.  
2e3a0 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21      useProxy = !
2e3b0 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26  (fsInfo.f_flags&
2e3c0 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20  MNT_LOCAL);.    
2e3d0 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f  }.    if( usePro
2e3e0 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  xy ){.      rc =
2e3f0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
2e400 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
2e410 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
2e420 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
2e430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e440 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78         rc = prox
2e450 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2e460 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46  le((unixFile*)pF
2e470 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a  ile, ":auto:");.
2e480 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2e490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e4a0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e         /* Use un
2e4b0 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e  ixClose to clean
2e4c0 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65   up the resource
2e4d0 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49  s added in fillI
2e4e0 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20  nUnixFile .     
2e4f0 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61       ** and clea
2e500 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74  r all the struct
2e510 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73  ure's references
2e520 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  .  Specifically,
2e530 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2e540 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77  File->pMethods w
2e550 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73  ill be NULL so s
2e560 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69  qlite3OsClose wi
2e570 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20  ll be a no-op . 
2e580 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e590 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28        unixClose(
2e5a0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
2e5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e5d0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2e5e0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
2e5f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
2e600 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  c = fillInUnixFi
2e610 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69  le(pVfs, fd, pFi
2e620 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46  le, zPath, ctrlF
2e630 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e  lags);..open_fin
2e640 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ished:.  if( rc!
2e650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e670 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a  ->pUnused);.  }.
2e680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e690 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2e6a0 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e  e file at zPath.
2e6b0 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20   If the dirSync 
2e6c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
2e6d0 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65  , fsync().** the
2e6e0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
2e6f0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
2e700 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
2e710 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20  t unixDelete(.  
2e720 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
2e730 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53  Used,     /* VFS
2e740 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
2e750 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20   as the xDelete 
2e760 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2e770 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2e780 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2e790 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
2e7a0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ted */.  int dir
2e7b0 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
2e7c0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66     /* If true, f
2e7d0 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79  sync() directory
2e7e0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
2e7f0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2e800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2e820 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2e830 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2e840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2e850 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69  ERR_DELETE);.  i
2e860 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74  f( osUnlink(zPat
2e870 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  h)==(-1) ){.    
2e880 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  if( errno==ENOEN
2e890 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
2e8a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2e8b0 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d  ETE_NOENT;.    }
2e8c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e8d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2e8e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2e8f0 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61  E, "unlink", zPa
2e900 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  th);.    }.    r
2e910 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69  eturn rc;.  }.#i
2e920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2e930 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69  ABLE_DIRSYNC.  i
2e940 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31 29  f( (dirSync & 1)
2e950 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  !=0 ){.    int f
2e960 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  d;.    rc = osOp
2e970 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
2e980 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28  h, &fd);.    if(
2e990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e9a0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
2e9b0 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
2e9c0 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65  (fd)==-1 ).#else
2e9d0 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63  .      if( fsync
2e9e0 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20  (fd) ).#endif.  
2e9f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63      {.        rc
2ea00 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2ea10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
2ea20 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c  _FSYNC, "fsync",
2ea30 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d   zPath);.      }
2ea40 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
2ea50 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
2ea60 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E__);.    }else 
2ea70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
2ea80 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
2ea90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2eaa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2eab0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
2eac0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ../*.** Test the
2ead0 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 6f 72   existance of or
2eae0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
2eaf0 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74  ons of file zPat
2eb00 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70  h. The.** test p
2eb10 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73  erformed depends
2eb20 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
2eb30 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
2eb40 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
2eb50 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31  EXISTS: Return 1
2eb60 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   if the file exi
2eb70 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  sts.**     SQLIT
2eb80 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
2eb90 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  TE: Return 1 if 
2eba0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
2ebb0 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a   and writable..*
2ebc0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2ebd0 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65  ESS_READONLY: Re
2ebe0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
2ebf0 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a  le is readable..
2ec00 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
2ec10 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
2ec20 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65  tic int unixAcce
2ec30 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
2ec40 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a  s *NotUsed,   /*
2ec50 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e   The VFS contain
2ec60 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73 73  ing this xAccess
2ec70 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
2ec80 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2ec90 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2eca0 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  the file to exam
2ecb0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ine */.  int fla
2ecc0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2ecd0 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77   /* What do we w
2ece0 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f  ant to learn abo
2ecf0 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c  ut the zPath fil
2ed00 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  e? */.  int *pRe
2ed10 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
2ed20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
2ed30 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a  boolean here */.
2ed40 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20 3d  ){.  int amode =
2ed50 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
2ed60 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
2ed70 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2ed80 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2ed90 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
2eda0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
2edb0 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
2edc0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2edd0 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  STS:.      amode
2ede0 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = F_OK;.      b
2edf0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
2ee00 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
2ee10 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61 6d  DWRITE:.      am
2ee20 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b  ode = W_OK|R_OK;
2ee30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ee40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2ee50 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 20  CESS_READ:.     
2ee60 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a 20   amode = R_OK;. 
2ee70 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2ee80 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2ee90 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
2eea0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
2eeb0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
2eec0 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a 50  t = (osAccess(zP
2eed0 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29 3b  ath, amode)==0);
2eee0 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51  .  if( flags==SQ
2eef0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2ef00 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20 29  TS && *pResOut )
2ef10 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
2ef20 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20 30  t buf;.    if( 0
2ef30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20  ==osStat(zPath, 
2ef40 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f  &buf) && buf.st_
2ef50 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  size==0 ){.     
2ef60 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
2ef70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ef80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ef90 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
2efa0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
2efb0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
2efc0 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
2efd0 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
2efe0 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
2eff0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
2f000 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
2f010 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
2f020 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
2f030 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
2f040 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
2f050 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
2f060 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
2f070 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
2f080 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
2f090 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
2f0a0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
2f0b0 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
2f0c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2f0d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2f0e0 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
2f0f0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
2f100 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2f110 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2f120 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
2f130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2f140 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
2f150 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
2f160 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
2f170 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
2f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f190 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
2f1a0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
2f1b0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
2f1c0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
2f1d0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2f1e0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
2f1f0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
2f200 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
2f210 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
2f220 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
2f230 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
2f240 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
2f250 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
2f260 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
2f270 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
2f280 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
2f290 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f2a0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
2f2b0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
2f2c0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
2f2d0 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
2f2e0 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
2f2f0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
2f300 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2f310 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
2f320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
2f330 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
2f340 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
2f350 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2f360 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
2f370 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
2f380 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
2f390 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
2f3a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
2f3b0 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
2f3c0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
2f3d0 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
2f3e0 20 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f   if( osGetcwd(zO
2f3f0 75 74 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29  ut, nOut-1)==0 )
2f400 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
2f410 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
2f420 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2f430 2c 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74  , "getcwd", zPat
2f440 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  h);.    }.    nC
2f450 77 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  wd = (int)strlen
2f460 28 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zOut);.    sqli
2f470 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
2f480 74 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43  t-nCwd, &zOut[nC
2f490 77 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74  wd], "/%s", zPat
2f4a0 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
2f4b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2f4c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f4d0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2f4e0 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2f4f0 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2f500 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2f510 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2f520 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2f530 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2f540 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2f550 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2f560 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ary..*/.#include
2f570 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69   <dlfcn.h>.stati
2f580 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70  c void *unixDlOp
2f590 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
2f5a0 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63  NotUsed, const c
2f5b0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
2f5c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f5d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
2f5e0 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46  return dlopen(zF
2f5f0 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f  ilename, RTLD_NO
2f600 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29  W | RTLD_GLOBAL)
2f610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  ;.}../*.** SQLit
2f620 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
2f630 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ction immediatel
2f640 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  y after a call t
2f650 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72  o unixDlSym() or
2f660 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29  .** unixDlOpen()
2f670 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20   fails (returns 
2f680 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e  a null pointer).
2f690 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69   If a more detai
2f6a0 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  led error.** mes
2f6b0 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c  sage is availabl
2f6c0 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  e, it is written
2f6d0 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20   to zBufOut. If 
2f6e0 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
2f6f0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
2f700 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66  , zBufOut is lef
2f710 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64  t unmodified and
2f720 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64   SQLite uses a d
2f730 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20  efault.** error 
2f740 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
2f750 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
2f760 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2f770 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
2f780 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
2f790 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
2f7a0 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
2f7b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
2f7c0 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ed);.  unixEnter
2f7d0 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
2f7e0 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
2f7f0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
2f800 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2f810 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
2f820 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
2f830 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2f840 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ();.}.static voi
2f850 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  d (*unixDlSym(sq
2f860 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
2f870 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  ed, void *p, con
2f880 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
2f890 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a  oid){.  /* .  **
2f8a0 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e   GCC with -pedan
2f8b0 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20  tic-errors says 
2f8c0 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f  that C90 does no
2f8d0 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20  t allow a void* 
2f8e0 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20  to be.  ** cast 
2f8f0 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2f900 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41  o a function.  A
2f910 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61  nd yet the libra
2f920 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69  ry dlsym() routi
2f930 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ne.  ** returns 
2f940 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73  a void* which is
2f950 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
2f960 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
2f970 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20    So how do we. 
2f980 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20   ** use dlsym() 
2f990 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
2f9a0 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors?.  **.  **
2f9b0 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f   Variable x belo
2f9c0 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  w is defined to 
2f9d0 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
2f9e0 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  a function takin
2f9f0 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  g.  ** parameter
2fa00 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73  s void* and cons
2fa10 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75  t char* and retu
2fa20 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  rning a pointer 
2fa30 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  to a function.. 
2fa40 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a   ** We initializ
2fa50 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67  e x by assigning
2fa60 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   it a pointer to
2fa70 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e   the dlsym() fun
2fa80 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61  ction..  ** (Tha
2fa90 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71  t assignment req
2faa0 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20  uires a cast.)  
2fab0 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65  Then we call the
2fac0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20   function that. 
2fad0 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e   ** x points to.
2fae0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
2faf0 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73  s work-around is
2fb00 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72   unlikely to wor
2fb10 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61  k correctly on a
2fb20 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a  ny system where.
2fb30 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20    ** you really 
2fb40 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75  cannot cast a fu
2fb50 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
2fb60 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20  nto void*.  But 
2fb70 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a  then, on the.  *
2fb80 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c  * other hand, dl
2fb90 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77  sym() will not w
2fba0 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79  ork on such a sy
2fbb0 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20  stem either, so 
2fbc0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74  we have.  ** not
2fbd0 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79   really lost any
2fbe0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f  thing..  */.  vo
2fbf0 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c  id (*(*x)(void*,
2fc00 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
2fc10 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
2fc20 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
2fc30 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28  ;.  x = (void(*(
2fc40 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  *)(void*,const c
2fc50 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73  har*))(void))dls
2fc60 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78  ym;.  return (*x
2fc70 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )(p, zSym);.}.st
2fc80 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
2fc90 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
2fca0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
2fcb0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
2fcc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2fcd0 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
2fce0 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
2fcf0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
2fd00 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2fd10 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
2fd20 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
2fd30 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
2fd40 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
2fd50 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
2fd60 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
2fd70 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
2fd80 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
2fd90 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
2fda0 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
2fdb0 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
2fdc0 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
2fdd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2fde0 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
2fdf0 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
2fe00 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
2fe10 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
2fe20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
2fe30 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
2fe40 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
2fe50 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
2fe60 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
2fe70 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
2fe80 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
2fe90 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
2fea0 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
2feb0 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
2fec0 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
2fed0 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
2fee0 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
2fef0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
2ff00 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
2ff10 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
2ff20 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
2ff30 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
2ff40 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
2ff50 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
2ff60 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
2ff70 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
2ff80 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
2ff90 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
2ffa0 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
2ffb0 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
2ffc0 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
2ffd0 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
2ffe0 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
2fff0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
30000 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
30010 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
30020 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
30030 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
30040 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
30050 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
30060 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
30070 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
30080 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
30090 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
300a0 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
300b0 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
300c0 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
300d0 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
300e0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
300f0 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20 21 64 65  , nBuf);.#if !de
30100 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
30110 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
30120 69 64 2c 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20  id, fd, got;.   
30130 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
30140 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
30150 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
30160 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
30170 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
30180 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
30190 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
301a0 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
301b0 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
301c0 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
301d0 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
301e0 6f 66 28 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  of(t)], &pid, si
301f0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
30200 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
30210 28 74 29 2b 73 69 7a 65 6f 66 28 70 69 64 29 3c  (t)+sizeof(pid)<
30220 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b  =(size_t)nBuf );
30230 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69  .      nBuf = si
30240 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66  zeof(t) + sizeof
30250 28 70 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pid);.    }else
30260 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20  {.      do{ got 
30270 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75  = osRead(fd, zBu
30280 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65  f, nBuf); }while
30290 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f  ( got<0 && errno
302a0 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
302b0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
302c0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
302d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
302e0 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
302f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
30300 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
30310 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
30320 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
30330 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
30340 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
30350 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
30360 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
30370 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
30380 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
30390 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
303a0 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
303b0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
303c0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
303d0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
303e0 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
303f0 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
30400 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
30410 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
30420 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
30430 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
30440 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
30450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30460 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
30470 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
30480 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
30490 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
304a0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
304b0 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
304c0 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
304d0 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
304e0 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
304f0 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
30500 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
30510 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
30520 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
30530 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30540 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
30550 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
30560 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
30570 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
30580 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
30590 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
305a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
305b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
305c0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
305d0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
305e0 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
305f0 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
30600 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
30610 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
30620 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
30630 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
30640 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
30650 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
30660 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
30670 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
30680 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
30690 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
306a0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
306b0 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
306c0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
306d0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
306e0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
306f0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
30700 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
30710 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
30720 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
30730 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
30740 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
30750 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
30760 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
30770 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
30780 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
30790 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
307a0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
307b0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
307c0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
307d0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
307e0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
307f0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
30800 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
30810 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
30820 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
30830 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
30840 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
30850 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
30860 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
30870 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
30880 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
30890 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
308a0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
308b0 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
308c0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
308d0 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
308e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
308f0 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
30900 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
30910 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a  time and date .*
30920 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
30930 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
30940 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
30950 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
30960 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69  s *NotUsed, sqli
30970 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
30980 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
30990 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
309a0 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
309b0 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
309c0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69  t64)8640000;.  i
309d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
309e0 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  K;.#if defined(N
309f0 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65  O_GETTOD).  time
30a00 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29  _t t;.  time(&t)
30a10 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73  ;.  *piNow = ((s
30a20 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a  qlite3_int64)t)*
30a30 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68  1000 + unixEpoch
30a40 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52  ;.#elif OS_VXWOR
30a50 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  KS.  struct time
30a60 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f  spec sNow;.  clo
30a70 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b  ck_gettime(CLOCK
30a80 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77  _REALTIME, &sNow
30a90 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  );.  *piNow = un
30aa0 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
30ab0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
30ac0 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
30ad0 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30  .tv_nsec/1000000
30ae0 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
30af0 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
30b00 20 69 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61   if( gettimeofda
30b10 79 28 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29  y(&sNow, 0)==0 )
30b20 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75  {.    *piNow = u
30b30 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
30b40 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
30b50 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
30b60 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a  w.tv_usec/1000;.
30b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
30b80 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
30b90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
30ba0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
30bb0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
30bc0 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
30bd0 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
30be0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
30bf0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
30c00 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
30c10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
30c20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
30c30 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
30c40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
30c50 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
30c60 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
30c70 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
30c80 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
30c90 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
30ca0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
30cb0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
30cc0 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
30cd0 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
30ce0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
30cf0 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
30d00 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
30d10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
30d20 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
30d30 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
30d40 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
30d50 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
30d60 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
30d70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30d80 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
30d90 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e   rc = unixCurren
30da0 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69  tTimeInt64(0, &i
30db0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  );.  *prNow = i/
30dc0 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65  86400000.0;.  re
30dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30de0 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78  * We added the x
30df0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
30e00 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69  ethod with the i
30e10 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76  ntention of prov
30e20 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20  iding.** better 
30e30 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
30e40 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70  messages when op
30e50 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70  erating-system p
30e60 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a  roblems come up.
30e70 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ** during SQLite
30e80 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
30e90 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66   so far, none of
30ea0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69   that has been i
30eb0 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e  mplemented.** in
30ec0 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74   the core.  So t
30ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
30ee0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f  ever called.  Fo
30ef0 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72  r now, it is mer
30f00 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68  ely.** a place-h
30f10 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  older..*/.static
30f20 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
30f30 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
30f40 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
30f50 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
30f60 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
30f70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
30f80 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
30f90 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
30fa0 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
30fb0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
30fc0 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  3);.  return 0;.
30fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../*.*********
30fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
30ff0 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  End of sqlite3_v
31000 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
31010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31020 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
31030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31070 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
31080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
310d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
310e0 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c  ** Begin Proxy L
310f0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
31100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31110 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72  *******.**.** Pr
31120 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  oxy locking is a
31130 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d   "uber-locking-m
31140 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73  ethod" in this s
31150 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74  ense:  It uses t
31160 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  he.** other lock
31170 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73  ing methods on s
31180 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69  econdary lock fi
31190 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b  les.  Proxy lock
311a0 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61  ing is a.** meta
311b0 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20  -layer over top 
311c0 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  of the primitive
311d0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
311e0 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72  nted above.  For
311f0 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  .** this reason,
31200 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
31210 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66  at implements of
31220 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
31230 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e  s deferred.** un
31240 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20  til late in the 
31250 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65  file (here) afte
31260 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68  r all of the oth
31270 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68  er I/O methods h
31280 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69  ave.** been defi
31290 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68  ned - so that th
312a0 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
312b0 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20  ing methods are 
312c0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
312d0 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70  services to help
312e0 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d   with the implem
312f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78  entation of prox
31300 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y locking..**.**
31310 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  **.**.** The def
31320 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68  ault locking sch
31330 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75  emes in SQLite u
31340 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  se byte-range lo
31350 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  cks on the.** da
31360 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
31370 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20  oordinate safe, 
31380 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73  concurrent acces
31390 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65  s by multiple re
313a0 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69  aders.** and wri
313b0 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c  ters [http://sql
313c0 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76  ite.org/lockingv
313d0 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69  3.html].  The fi
313e0 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ve file locking.
313f0 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43  ** states (UNLOC
31400 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48  KED, PENDING, SH
31410 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
31420 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69  EXCLUSIVE) are i
31430 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73  mplemented.** as
31440 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72   POSIX read & wr
31450 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66  ite locks over f
31460 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61  ixed set of loca
31470 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c  tions (via fsctl
31480 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64  ),.** on AFP and
31490 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73   SMB only exclus
314a0 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  ive byte-range l
314b0 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62  ocks are availab
314c0 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20  le via fsctl.** 
314d0 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20  with _IOWR('z', 
314e0 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
314f0 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20  angeLockPB2) to 
31500 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35  track the same 5
31510 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73   states..** To s
31520 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43  imulate a F_RDLC
31530 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  K on the shared 
31540 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20  range, on AFP a 
31550 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65  randomly selecte
31560 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20  d.** address in 
31570 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
31580 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20   is taken for a 
31590 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
315a0 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65   entire.** share
315b0 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
315c0 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56   for an EXCLUSIV
315d0 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20  E lock):.**.**  
315e0 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
315f0 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
31600 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52  00.**      RESER
31610 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
31620 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
31630 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
31640 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
31650 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
31660 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
31670 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
31680 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
31690 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
316a0 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
316b0 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
316c0 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
316d0 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
316e0 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
316f0 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
31700 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
31710 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
31720 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
31730 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
31740 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
31750 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
31760 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
31770 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
31780 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
31790 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
317a0 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
317b0 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
317c0 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
317d0 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
317e0 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
317f0 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
31800 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
31810 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
31820 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
31830 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
31840 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
31850 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
31860 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
31870 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
31880 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
31890 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
318a0 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
318b0 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
318c0 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
318d0 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
318e0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
318f0 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
31900 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
31910 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
31920 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
31930 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
31940 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
31950 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
31960 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
31970 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
31980 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
31990 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
319a0 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
319b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
319c0 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
319d0 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
319e0 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
319f0 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
31a00 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
31a10 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
31a20 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
31a30 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
31a40 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
31a50 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
31a60 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
31a70 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
31aa0 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
31ab0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
31ac0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
31ad0 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
31ae0 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
31af0 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
31b00 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
31b10 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
31b20 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
31b30 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
31b40 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
31b50 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
31b60 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
31b70 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
31b80 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
31b90 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
31ba0 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
31bb0 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
31bc0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
31bd0 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
31be0 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
31bf0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
31c00 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
31c10 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
31c20 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
31c30 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
31c40 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
31c50 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
31c60 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
31c70 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
31c80 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
31c90 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
31ca0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
31cb0 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
31cc0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
31cd0 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
31ce0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
31cf0 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
31d00 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
31d10 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
31d20 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
31d30 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
31d40 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
31d50 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
31d60 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
31d70 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
31d80 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
31d90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
31da0 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
31db0 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
31dc0 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
31dd0 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
31de0 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
31df0 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
31e00 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
31e10 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
31e20 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
31e30 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
31e40 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
31e50 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
31e60 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
31e70 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
31e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31e90 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
31ea0 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
31eb0 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
31ec0 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
31ed0 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
31ee0 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
31ef0 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
31f00 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
31f10 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
31f20 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
31f30 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
31f40 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
31f50 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
31f60 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
31f70 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
31f80 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
31f90 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
31fa0 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
31fb0 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
31fc0 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
31fd0 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
31fe0 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
31ff0 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
32000 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
32010 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
32020 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
32030 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
32040 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
32050 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
32060 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
32070 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
32080 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
32090 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
320a0 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
320b0 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
320c0 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
320d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
320e0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
320f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32100 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
32110 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
32120 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
32130 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
32140 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
32150 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
32160 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
32170 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
32180 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
32190 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
321a0 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
321b0 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
321c0 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
321d0 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
321e0 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
321f0 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
32200 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
32210 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
32220 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
32230 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
32240 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
32250 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
32260 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
32270 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
32280 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
32290 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
322a0 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
322b0 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
322c0 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
322d0 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
322e0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
322f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
32300 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
32310 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
32320 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
32330 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
32340 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
32350 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32360 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
32370 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
32380 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
32390 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
323a0 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
323b0 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
323c0 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
323d0 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
323e0 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
323f0 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
32400 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
32410 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
32420 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
32430 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
32440 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
32450 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
32460 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
32470 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
32480 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
32490 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
324a0 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
324b0 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
324c0 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
324d0 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
324e0 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
324f0 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
32500 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
32510 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
32520 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
32530 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
32540 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
32550 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
32560 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
32570 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
32580 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
32590 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
325a0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
325b0 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
325c0 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
325d0 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
325e0 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
325f0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
32600 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
32610 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
32620 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
32630 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
32640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32650 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
32660 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
32670 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
32680 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
32690 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
326a0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
326b0 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
326c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
326d0 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
326e0 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
326f0 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
32700 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
32710 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
32720 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
32730 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
32740 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
32750 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
32760 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
32770 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
32780 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
32790 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
327a0 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
327b0 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
327c0 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
327d0 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
327e0 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
327f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
32800 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
32810 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
32820 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
32830 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
32840 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
32850 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
32860 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
32870 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
32880 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
32890 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
328a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
328b0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
328c0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
328d0 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
328e0 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
328f0 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
32900 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
32910 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
32920 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
32930 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
32940 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
32950 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
32960 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
32970 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
32980 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
32990 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
329a0 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
329b0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
329c0 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
329d0 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
329e0 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
329f0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
32a00 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
32a10 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
32a20 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
32a30 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
32a40 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
32a50 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
32a60 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
32a70 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
32a80 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
32a90 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
32aa0 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
32ab0 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
32ac0 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
32ad0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
32ae0 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
32af0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
32b00 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
32b10 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
32b20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
32b30 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
32b40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32b50 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
32b60 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
32b70 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
32b80 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
32b90 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
32ba0 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
32bb0 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
32bc0 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
32bd0 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
32be0 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
32bf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
32c00 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
32c10 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
32c20 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
32c30 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
32c40 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
32c50 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
32c60 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
32c70 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
32c80 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
32c90 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
32ca0 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
32cb0 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
32cc0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
32cd0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
32ce0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
32cf0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
32d00 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
32d10 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
32d20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
32d30 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
32d40 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
32d50 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
32d60 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
32d70 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
32d80 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
32d90 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
32da0 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
32db0 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
32dc0 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
32dd0 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
32de0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
32df0 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
32e00 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
32e10 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
32e20 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
32e30 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
32e40 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
32e50 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
32e60 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
32e70 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
32e80 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
32e90 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
32ea0 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
32eb0 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
32ec0 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
32ed0 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
32ee0 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
32ef0 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
32f00 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
32f10 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
32f20 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
32f30 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
32f40 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
32f50 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
32f60 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
32f70 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
32f80 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
32f90 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
32fa0 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
32fb0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
32fc0 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
32fd0 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
32fe0 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
32ff0 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
33000 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
33010 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
33020 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
33030 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
33040 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
33050 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
33060 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ()));.      retu
33070 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
33080 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
33090 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
330a0 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63  ath, "sqliteploc
330b0 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20  ks", maxLen);   
330c0 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c   .  }.# else.  l
330d0 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
330e0 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78  th, "/tmp/", max
330f0 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65  Len);.# endif.#e
33100 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74  ndif..  if( lPat
33110 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b  h[len-1]!='/' ){
33120 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  .    len = strlc
33130 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d  at(lPath, "/", m
33140 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20  axLen);.  }.  . 
33150 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68   /* transform th
33160 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75  e db path to a u
33170 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65  nique cache name
33180 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69   */.  dbLen = (i
33190 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68  nt)strlen(dbPath
331a0 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69  );.  for( i=0; i
331b0 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e  <dbLen && (i+len
331c0 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e 3b  +7)<(int)maxLen;
331d0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
331e0 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20  c = dbPath[i];. 
331f0 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20     lPath[i+len] 
33200 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63  = (c=='/')?'_':c
33210 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b  ;.  }.  lPath[i+
33220 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72  len]='\0';.  str
33230 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61 75  lcat(lPath, ":au
33240 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20  to:", maxLen);. 
33250 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
33260 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f  CKPATH  proxy lo
33270 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
33280 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 67 65 74  d\n", lPath, get
33290 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
332a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
332b0 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20  /* . ** Creates 
332c0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e  the lock file an
332d0 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69  d any missing di
332e0 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63  rectories in loc
332f0 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63  kPath. */.static
33300 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
33310 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
33320 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a  har *lockPath){.
33330 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20    int i, len;.  
33340 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48  char buf[MAXPATH
33350 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72  LEN];.  int star
33360 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  t = 0;.  .  asse
33370 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c  rt(lockPath!=NUL
33380 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20  L);.  /* try to 
33390 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69  create all the i
333a0 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65  ntermediate dire
333b0 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e  ctories */.  len
333c0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c   = (int)strlen(l
333d0 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b  ockPath);.  buf[
333e0 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d  0] = lockPath[0]
333f0 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c  ;.  for( i=1; i<
33400 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  len; i++ ){.    
33410 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20  if( lockPath[i] 
33420 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73  == '/' && (i - s
33430 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20  tart > 0) ){.   
33440 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72     /* only mkdir
33450 20 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20   if leaf dir != 
33460 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e  "." or "/" or ".
33470 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ." */.      if( 
33480 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d  i-start>2 || (i-
33490 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b  start==1 && buf[
334a0 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
334b0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
334c0 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  /') .         ||
334d0 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20   (i-start==2 && 
334e0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
334f0 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31  ' && buf[start+1
33500 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20  ] != '.') ){.   
33510 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27       buf[i]='\0'
33520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73  ;.        if( os
33530 4d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  Mkdir(buf, SQLIT
33540 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
33550 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
33560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
33570 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
33580 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
33590 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
335a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
335b0 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
335c0 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
335d0 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
335e0 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
335f0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
33600 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
33610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33620 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
33630 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
33640 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20  , getpid()));.  
33650 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33660 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
33670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33680 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
33690 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
336a0 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
336b0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
336c0 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
336d0 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
336e0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
336f0 22 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ", lockPath, get
33700 70 69 64 28 29 29 29 3b 0a 20 20 72 65 74 75 72  pid()));.  retur
33710 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
33720 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
33730 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
33740 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
33750 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
33760 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
33770 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
33780 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
33790 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
337a0 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
337b0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
337c0 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
337d0 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
337e0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
337f0 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
33800 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
33810 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
33820 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
33830 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
33840 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
33850 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20  ateUnixFile(.   
33860 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
33870 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74  h,        /* pat
33880 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  h for the new un
33890 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e  ixFile */.    un
338a0 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c  ixFile **ppFile,
338b0 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69         /* unixFi
338c0 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72  le created and r
338d0 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a  eturned by ref *
338e0 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b  /.    int islock
338f0 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f  file           /
33900 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69  * if non zero mi
33910 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20  ssing dirs will 
33920 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20  be created */.) 
33930 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
33940 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
33950 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
33960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
33970 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
33980 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
33990 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
339a0 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
339b0 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
339c0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
339d0 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
339e0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
339f0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
33a00 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
33a10 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
33a20 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
33a30 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
33a40 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
33a50 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
33a60 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
33a70 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
33a80 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
33a90 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
33aa0 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
33ab0 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
33ac0 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
33ad0 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
33ae0 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
33af0 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
33b00 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
33b10 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
33b20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
33b30 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
33b40 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
33b50 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
33b60 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
33b70 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
33b80 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
33b90 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
33ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33bb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
33bc0 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
33bd0 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
33be0 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
33bf0 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
33c00 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
33c10 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
33c20 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
33c30 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
33c40 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
33c50 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
33c60 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
33c70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
33c80 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
33c90 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
33ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33cb0 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
33cc0 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
33cd0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
33ce0 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
33cf0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
33d00 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
33d10 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
33d20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
33d30 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
33d40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33d50 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
33d60 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
33d70 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
33d80 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
33d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33da0 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
33db0 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
33dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
33dd0 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
33de0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
33df0 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
33e00 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
33e10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33e20 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
33e30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
33e40 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
33e50 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
33e60 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b  (sizeof(*pNew));
33e70 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c  .  if( pNew==NUL
33e80 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  L ){.    rc = SQ
33e90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
33ea0 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f  goto end_create_
33eb0 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d  proxy;.  }.  mem
33ec0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
33ed0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
33ee0 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67    pNew->openFlag
33ef0 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
33f00 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66   memset(&dummyVf
33f10 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  s, 0, sizeof(dum
33f20 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79  myVfs));.  dummy
33f30 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28  Vfs.pAppData = (
33f40 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49  void*)&autolockI
33f50 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79  oFinder;.  dummy
33f60 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d  Vfs.zName = "dum
33f70 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e  my";.  pUnused->
33f80 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73  fd = fd;.  pUnus
33f90 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e  ed->flags = open
33fa0 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70  Flags;.  pNew->p
33fb0 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
33fc0 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c  ;.  .  rc = fill
33fd0 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d  InUnixFile(&dumm
33fe0 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74  yVfs, fd, (sqlit
33ff0 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70  e3_file*)pNew, p
34000 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ath, 0);.  if( r
34010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34020 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
34030 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
34040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
34050 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
34060 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f     .  robust_clo
34070 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c  se(pNew, fd, __L
34080 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65  INE__);.  sqlite
34090 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
340a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e  sqlite3_free(pUn
340b0 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  used);.  return 
340c0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
340d0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d  LITE_TEST./* sim
340e0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
340f0 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
34100 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
34110 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74  ile paths */.int
34120 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
34130 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  num = 0;.#endif.
34140 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
34150 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20  OSTIDLEN    16  
34160 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f  /* conch file ho
34170 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a  st id length */.
34180 0a 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64  ./* Not always d
34190 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  efined in the he
341a0 61 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68  aders as it ough
341b0 74 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72  t to be */.exter
341c0 6e 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69  n int gethostuui
341d0 64 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e  d(uuid_t id, con
341e0 73 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  st struct timesp
341f0 65 63 20 2a 77 61 69 74 29 3b 0a 0a 2f 2a 20 67  ec *wait);../* g
34200 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76  et the host ID v
34210 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29  ia gethostuuid()
34220 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70  , pHostID must p
34230 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f  oint to PROXY_HO
34240 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65  STIDLEN .** byte
34250 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65  s of writable me
34260 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
34270 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74  int proxyGetHost
34280 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ID(unsigned char
34290 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a   *pHostID, int *
342a0 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72  pError){.  asser
342b0 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  t(PROXY_HOSTIDLE
342c0 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64  N == sizeof(uuid
342d0 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  _t));.  memset(p
342e0 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59  HostID, 0, PROXY
342f0 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66  _HOSTIDLEN);.#if
34300 20 64 65 66 69 6e 65 64 28 5f 5f 4d 41 58 5f 4f   defined(__MAX_O
34310 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  S_X_VERSION_MIN_
34320 52 45 51 55 49 52 45 44 29 5c 0a 20 20 20 20 20  REQUIRED)\.     
34330 20 20 20 20 20 20 20 20 20 20 26 26 20 5f 5f 4d            && __M
34340 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f  AC_OS_X_VERSION_
34350 4d 49 4e 5f 52 45 51 55 49 52 45 44 3c 31 30 35  MIN_REQUIRED<105
34360 30 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  0.  {.    static
34370 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 74 69   const struct ti
34380 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d  mespec timeout =
34390 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65   {1, 0}; /* 1 se
343a0 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20  c timeout */.   
343b0 20 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64   if( gethostuuid
343c0 28 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f  (pHostID, &timeo
343d0 75 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ut) ){.      int
343e0 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20   err = errno;.  
343f0 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
34400 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 72 72 6f  {.        *pErro
34410 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 20 20 7d  r = err;.      }
34420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
34430 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
34440 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
34450 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
34460 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 23  Error);.#endif.#
34470 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
34480 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20  T.  /* simulate 
34490 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
344a0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
344b0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
344c0 74 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ths */.  if( sql
344d0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
344e0 21 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74  != 0){.    pHost
344f0 49 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70  ID[0] = (char)(p
34500 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61  HostID[0] + (cha
34510 72 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  r)(sqlite3_hosti
34520 64 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a  d_num & 0xFF));.
34530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
34540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34550 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63  ;.}../* The conc
34560 68 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  h file contains 
34570 74 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74  the header, host
34580 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   id and lock fil
34590 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69  e path. */.#defi
345a0 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ne PROXY_CONCHVE
345b0 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62  RSION 2   /* 1-b
345c0 79 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62  yte header, 16-b
345d0 79 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74  yte host id, pat
345e0 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  h */.#define PRO
345f0 58 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20  XY_HEADERLEN    
34600 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  1   /* conch fil
34610 65 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  e header length 
34620 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  */.#define PROXY
34630 5f 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50  _PATHINDEX    (P
34640 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
34650 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a  ROXY_HOSTIDLEN).
34660 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41  #define PROXY_MA
34670 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58  XCONCHLEN  (PROX
34680 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58  Y_HEADERLEN+PROX
34690 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50  Y_HOSTIDLEN+MAXP
346a0 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20  ATHLEN)../* .** 
346b0 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f  Takes an open co
346c0 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73  nch file, copies
346d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f   the contents to
346e0 20 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20   a new path and 
346f0 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69  then moves .** i
34700 74 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77  t back.  The new
34710 6c 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27  ly created file'
34720 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  s file descripto
34730 72 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f  r is assigned to
34740 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69   the.** conch fi
34750 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  le structure and
34760 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69   finally the ori
34770 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65  ginal conch file
34780 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a   descriptor is .
34790 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75  ** closed.  Retu
347a0 72 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63  rns zero if succ
347b0 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69  essful..*/.stati
347c0 63 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b  c int proxyBreak
347d0 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69  ConchLock(unixFi
347e0 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f  le *pFile, uuid_
347f0 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70  t myHostID){.  p
34800 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
34810 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
34820 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34830 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
34840 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78  Context; .  unix
34850 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
34860 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
34870 65 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b  e;.  char tPath[
34880 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63  MAXPATHLEN];.  c
34890 68 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41  har buf[PROXY_MA
348a0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68  XCONCHLEN];.  ch
348b0 61 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78  ar *cPath = pCtx
348c0 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b  ->conchFilePath;
348d0 0a 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65  .  size_t readLe
348e0 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20  n = 0;.  size_t 
348f0 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  pathLen = 0;.  c
34900 68 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d  har errmsg[64] =
34910 20 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20   "";.  int fd = 
34920 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d  -1;.  int rc = -
34930 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  1;.  UNUSED_PARA
34940 4d 45 54 45 52 28 6d 79 48 6f 73 74 49 44 29 3b  METER(myHostID);
34950 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20  ..  /* create a 
34960 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70 6c  new path by repl
34970 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  ace the trailing
34980 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27   '-conch' with '
34990 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74  -break' */.  pat
349a0 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74  hLen = strlcpy(t
349b0 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58  Path, cPath, MAX
349c0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20  PATHLEN);.  if( 
349d0 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c  pathLen>MAXPATHL
349e0 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20  EN || pathLen<6 
349f0 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70  || .     (strlcp
34a00 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e  y(&tPath[pathLen
34a10 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29  -5], "break", 6)
34a20 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 71   != 5) ){.    sq
34a30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
34a40 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72  izeof(errmsg),er
34a50 72 6d 73 67 2c 22 70 61 74 68 20 65 72 72 6f 72  rmsg,"path error
34a60 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29   (len %d)",(int)
34a70 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 67 6f  pathLen);.    go
34a80 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
34a90 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61 64 20  ;.  }.  /* read 
34aa0 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74 65 6e  the conch conten
34ab0 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e 20 3d  t */.  readLen =
34ac0 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
34ad0 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58  le->h, buf, PROX
34ae0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
34af0 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e  );.  if( readLen
34b00 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  <PROXY_PATHINDEX
34b10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
34b20 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
34b30 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
34b40 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20  read error (len 
34b50 25 64 29 22 2c 28 69 6e 74 29 72 65 61 64 4c 65  %d)",(int)readLe
34b60 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
34b70 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
34b80 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
34b90 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
34ba0 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
34bb0 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
34bc0 70 65 6e 28 74 50 61 74 68 2c 20 28 4f 5f 52 44  pen(tPath, (O_RD
34bd0 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  WR|O_CREAT|O_EXC
34be0 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64  L), 0);.  if( fd
34bf0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
34c00 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
34c10 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
34c20 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c 65  g, "create faile
34c30 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
34c40 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
34c50 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69  eaklock;.  }.  i
34c60 66 28 20 6f 73 50 77 72 69 74 65 28 66 64 2c 20  f( osPwrite(fd, 
34c70 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29  buf, readLen, 0)
34c80 20 21 3d 20 28 73 73 69 7a 65 5f 74 29 72 65 61   != (ssize_t)rea
34c90 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  dLen ){.    sqli
34ca0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
34cb0 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
34cc0 6d 73 67 2c 20 22 77 72 69 74 65 20 66 61 69 6c  msg, "write fail
34cd0 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
34ce0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
34cf0 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
34d00 69 66 28 20 72 65 6e 61 6d 65 28 74 50 61 74 68  if( rename(tPath
34d10 2c 20 63 50 61 74 68 29 20 29 7b 0a 20 20 20 20  , cPath) ){.    
34d20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34d30 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
34d40 20 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d 65   errmsg, "rename
34d50 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
34d60 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rrno);.    goto 
34d70 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
34d80 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 66   }.  rc = 0;.  f
34d90 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34da0 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63 6b  broke stale lock
34db0 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74 68   on %s\n", cPath
34dc0 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  );.  robust_clos
34dd0 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63 68 46 69  e(pFile, conchFi
34de0 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
34df0 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ;.  conchFile->h
34e00 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63 68 46 69   = fd;.  conchFi
34e10 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  le->openFlags = 
34e20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
34e30 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  ;..end_breaklock
34e40 3a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  :.  if( rc ){.  
34e50 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
34e60 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 74 50       osUnlink(tP
34e70 61 74 68 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  ath);.      robu
34e80 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
34e90 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
34ea0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
34eb0 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64  (stderr, "failed
34ec0 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20   to break stale 
34ed0 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e  lock on %s, %s\n
34ee0 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67  ", cPath, errmsg
34ef0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34f00 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74  rc;.}../* Take t
34f10 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
34f20 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  k on the conch f
34f30 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20  ile and break a 
34f40 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68  stale lock if th
34f50 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61  e .** host id ma
34f60 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
34f70 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c   int proxyConchL
34f80 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
34f90 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
34fa0 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79  stID, int lockTy
34fb0 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  pe){.  proxyLock
34fc0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
34fd0 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
34fe0 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
34ff0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
35000 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f   .  unixFile *co
35010 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
35020 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74  conchFile;.  int
35030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35040 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20  .  int nTries = 
35050 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  0;.  struct time
35060 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d  spec conchModTim
35070 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28 26  e;.  .  memset(&
35080 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c 20 30 2c  conchModTime, 0,
35090 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68 4d 6f 64   sizeof(conchMod
350a0 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20 7b 0a 20  Time));.  do {. 
350b0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
350c0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
350d0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
350e0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
350f0 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65  Type);.    nTrie
35100 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63  s ++;.    if( rc
35110 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
35120 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
35130 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75   lock failed (bu
35140 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73  sy):.       * 1s
35150 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d  t try: get the m
35160 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63  od time of the c
35170 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20  onch, wait 0.5s 
35180 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a  and try again. .
35190 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79         * 2nd try
351a0 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f  : fail if the mo
351b0 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f  d time changed o
351c0 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66  r host id is dif
351d0 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20  ferent, wait .  
351e0 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
351f0 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
35200 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33  again.       * 3
35210 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68  rd try: break th
35220 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68  e lock unless th
35230 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63  e mod time has c
35240 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a  hanged..       *
35250 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
35260 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69  tat buf;.      i
35270 66 28 20 6f 73 46 73 74 61 74 28 63 6f 6e 63 68  f( osFstat(conch
35280 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
35290 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
352a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
352b0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
352c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
352d0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
352e0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
352f0 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  Tries==1 ){.    
35300 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
35310 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73   = buf.st_mtimes
35320 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c  pec;.        usl
35330 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20  eep(500000); /* 
35340 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64  wait 0.5 sec and
35350 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
35360 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ain*/.        co
35370 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
35380 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
35390 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20   nTries>1 );.   
353a0 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54     if( conchModT
353b0 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75  ime.tv_sec != bu
353c0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
353d0 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20  v_sec || .      
353e0 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e     conchModTime.
353f0 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73  tv_nsec != buf.s
35400 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e  t_mtimespec.tv_n
35410 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sec ){.        r
35420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
35430 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
35440 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
35450 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20  es==2 ){  .     
35460 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f     char tBuf[PRO
35470 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
35480 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
35490 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
354a0 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50  File->h, tBuf, P
354b0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
354c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
354d0 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
354e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
354f0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
35500 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35510 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
35520 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
35530 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f       if( len>PRO
35540 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20  XY_PATHINDEX && 
35550 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50  tBuf[0]==(char)P
35560 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
35570 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  N){.          /*
35580 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65   don't break the
35590 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73   lock if the hos
355a0 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74  t id doesn't mat
355b0 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
355c0 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74  if( 0!=memcmp(&t
355d0 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
355e0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
355f0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
35600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
35620 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
35630 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
35640 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
35650 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
35660 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f   on short read o
35670 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d  r a version mism
35680 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
35690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
356a0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
356b0 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
356c0 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  0000000); /* wai
356d0 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79  t 10 sec and try
356e0 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20   the lock again 
356f0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
35700 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  nue; .      }.  
35710 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72      .      asser
35720 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a  t( nTries==3 );.
35730 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f        if( 0==pro
35740 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
35750 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44  (pFile, myHostID
35760 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
35770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
35780 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70       if( lockTyp
35790 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
357a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
357b0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
357c0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
357d0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
357e0 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
357f0 4f 43 4b 29 3b 20 20 20 20 20 20 20 20 20 20 0a  OCK);          .
35800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35810 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
35820 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
35830 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
35840 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
35850 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
35860 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 20  lockType);.     
35870 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35880 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20 72 63   }.  } while( rc
35890 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
358a0 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20 20 0a   nTries<3 );.  .
358b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
358c0 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63 6f 6e  /* Takes the con
358d0 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61 20 73  ch by taking a s
358e0 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 72  hared lock and r
358f0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ead the contents
35900 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a 20 6c   conch, if .** l
35910 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e 2d 4e  ockPath is non-N
35920 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20 49 44  ULL, the host ID
35930 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70   and lock file p
35940 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  ath must match. 
35950 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b   A NULL .** lock
35960 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61 74 20  Path means that 
35970 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69 6e 20  the lockPath in 
35980 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
35990 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66 20 74  ill be used if t
359a0 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44 73 20  he .** host IDs 
359b0 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65 77 20  match, or a new 
359c0 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62  lock path will b
359d0 65 20 67 65 6e 65 72 61 74 65 64 20 61 75 74 6f  e generated auto
359e0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e  matically .** an
359f0 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
35a00 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a   conch file..*/.
35a10 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35a20 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  TakeConch(unixFi
35a30 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 70 72  le *pFile){.  pr
35a40 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
35a50 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
35a60 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
35a70 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
35a80 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20 69 66  ontext; .  .  if
35a90 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c  ( pCtx->conchHel
35aa0 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d!=0 ){.    retu
35ab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
35ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46  }else{.    unixF
35ad0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
35ae0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
35af0 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d 79 48  ;.    uuid_t myH
35b00 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74 20 70  ostID;.    int p
35b10 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63  Error = 0;.    c
35b20 68 61 72 20 72 65 61 64 42 75 66 5b 50 52 4f 58  har readBuf[PROX
35b30 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
35b40 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50 61 74      char lockPat
35b50 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  h[MAXPATHLEN];. 
35b60 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c 6f 63     char *tempLoc
35b70 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  kPath = NULL;.  
35b80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35b90 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 63 72  E_OK;.    int cr
35ba0 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b 0a 20  eateConch = 0;. 
35bb0 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d 61 74     int hostIdMat
35bc0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
35bd0 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 20  readLen = 0;.   
35be0 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63 6b 50   int tryOldLockP
35bf0 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ath = 0;.    int
35c00 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
35c10 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  h = 0;.    .    
35c20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45 43 4f  OSTRACE(("TAKECO
35c30 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
35c40 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
35c50 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
35c60 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b       (pCtx->lock
35c70 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78  ProxyPath ? pCtx
35c80 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
35c90 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74  : ":auto:"), get
35ca0 70 69 64 28 29 29 29 3b 0a 0a 20 20 20 20 72 63  pid()));..    rc
35cb0 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49   = proxyGetHostI
35cc0 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70 45 72  D(myHostID, &pEr
35cd0 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ror);.    if( (r
35ce0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
35cf0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20 20 70  IOERR ){.      p
35d00 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
35d10 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
35d20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
35d30 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ch;.    }.    rc
35d40 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
35d50 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
35d60 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  D, SHARED_LOCK);
35d70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
35d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35d90 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  goto end_takecon
35da0 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ch;.    }.    /*
35db0 20 72 65 61 64 20 74 68 65 20 65 78 69 73 74 69   read the existi
35dc0 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  ng conch file */
35dd0 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73  .    readLen = s
35de0 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
35df0 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  File*)conchFile,
35e00 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f   0, readBuf, PRO
35e10 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b  XY_MAXCONCHLEN);
35e20 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e  .    if( readLen
35e30 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  <0 ){.      /* I
35e40 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72  /O error: lastEr
35e50 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
35e60 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20  ndRead */.      
35e70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
35e80 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61   = conchFile->la
35e90 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
35ea0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
35eb0 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74  _READ;.      got
35ec0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
35ed0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
35ee0 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48  eadLen<=(PROXY_H
35ef0 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
35f00 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20  OSTIDLEN) || .  
35f10 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42             readB
35f20 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f  uf[0]!=(char)PRO
35f30 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
35f40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68  ){.      /* a sh
35f50 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73  ort read or vers
35f60 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61  ion format misma
35f70 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65  tch means we nee
35f80 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
35f90 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63  w .      ** conc
35fa0 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a  h file. .      *
35fb0 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f  /.      createCo
35fc0 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nch = 1;.    }. 
35fd0 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73     /* if the hos
35fe0 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64  t id matches and
35ff0 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61   the lock path a
36000 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
36010 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a   the conch.    *
36020 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75  * we'll try to u
36030 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72  se the path ther
36040 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f  e, if we can't o
36050 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77  pen that path, w
36060 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74  e'll .    ** ret
36070 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75  ry with a new au
36080 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74  to-generated pat
36090 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  h .    */.    do
360a0 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65   { /* in case we
360b0 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61   need to try aga
360c0 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a  in for an :auto:
360d0 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65   named lock file
360e0 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
360f0 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21  createConch && !
36100 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
36110 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74   ){.        host
36120 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d  IdMatch = !memcm
36130 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  p(&readBuf[PROXY
36140 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
36150 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20  ostID, .        
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36170 20 20 20 20 20 20 20 20 20 20 50 52 4f 58 59 5f            PROXY_
36180 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20  HOSTIDLEN);.    
36190 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f      /* if the co
361a0 6e 63 68 20 68 61 73 20 64 61 74 61 20 63 6f 6d  nch has data com
361b0 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
361c0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
361d0 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
361e0 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  yPath ){.       
361f0 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f 2d 6e     /* for auto-n
36200 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  amed local lock 
36210 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65 63 6b  file, just check
36220 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
36230 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20 20 20   we'll.         
36240 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c 6f 63    ** use the loc
36250 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  al lock file pat
36260 68 20 74 68 61 74 27 73 20 61 6c 72 65 61 64 79  h that's already
36270 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20 20 20   in there.      
36280 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
36290 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63    if( hostIdMatc
362a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
362b0 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20   size_t pathLen 
362c0 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50 52 4f  = (readLen - PRO
362d0 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b 0a 20  XY_PATHINDEX);. 
362e0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
362f0 20 20 20 20 20 20 20 20 69 66 28 20 70 61 74 68          if( path
36300 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45 4e 20  Len>=MAXPATHLEN 
36310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
36320 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41 54 48   pathLen=MAXPATH
36330 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  LEN-1;.         
36340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
36350 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61 74 68   memcpy(lockPath
36360 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
36370 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 61 74  _PATHINDEX], pat
36380 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  hLen);.         
36390 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61 74 68     lockPath[path
363a0 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Len] = 0;.      
363b0 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61        tempLockPa
363c0 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20  th = lockPath;. 
363d0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c             tryOl
363e0 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  dLockPath = 1;. 
363f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 72             /* cr
36400 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
36410 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69 66 20  he lock path if 
36420 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
36430 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
36440 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
36450 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20 20 20  onch;.          
36460 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
36470 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63 68 0a  if( hostIdMatch.
36480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
36490 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d  & !strncmp(pCtx-
364a0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
364b0 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 50  &readBuf[PROXY_P
364c0 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20 20 20  ATHINDEX],.     
364d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364e0 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d 50 52        readLen-PR
364f0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 0a 20  OXY_PATHINDEX). 
36500 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
36510 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68 6f 73      /* conch hos
36520 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74 68 20  t and lock path 
36530 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
36540 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65     goto end_take
36550 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20 20 20  conch; .        
36560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36570 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65  .      /* if the
36580 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77 72 69   conch isn't wri
36590 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73 6e 27  table and doesn'
365a0 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61 6e 27  t match, we can'
365b0 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20 20 20  t take it */.   
365c0 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46 69 6c     if( (conchFil
365d0 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52  e->openFlags&O_R
365e0 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  DWR) == 0 ){.   
365f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
36600 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
36610 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
36620 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  h;.      }.     
36630 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74 68 65   .      /* eithe
36640 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69 64 6e  r the conch didn
36650 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65 20 6e  't match or we n
36660 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
36670 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  new one */.     
36680 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b   if( !pCtx->lock
36690 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20  ProxyPath ){.   
366a0 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c 6f 63       proxyGetLoc
366b0 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62 50 61  kPath(pCtx->dbPa
366c0 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 4d 41  th, lockPath, MA
366d0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
366e0 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20     tempLockPath 
366f0 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20  = lockPath;.    
36700 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
36710 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
36720 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69 66 20   path _only_ if 
36730 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74 61 6b  the conch is tak
36740 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
36750 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 75 70      .      /* up
36760 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74 68 20  date conch with 
36770 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20 28 74  host and path (t
36780 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20 69 66  his will fail if
36790 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
367a0 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20 73 68       ** has a sh
367b0 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65 61 64  ared lock alread
367c0 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73 74 20  y), if the host 
367d0 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73 65 20  id matches, use 
367e0 74 68 65 20 62 69 67 0a 20 20 20 20 20 20 2a 2a  the big.      **
367f0 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stick..      */
36800 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73 28 63  .      futimes(c
36810 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e 55 4c  onchFile->h, NUL
36820 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 6f  L);.      if( ho
36830 73 74 49 64 4d 61 74 63 68 20 26 26 20 21 63 72  stIdMatch && !cr
36840 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20  eateConch ){.   
36850 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69       if( conchFi
36860 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 63 6f  le->pInode && co
36870 6e 63 68 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  nchFile->pInode-
36880 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
36890 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
368a0 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
368b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
368c0 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
368d0 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  d in this.      
368e0 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
368f0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
36900 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
36910 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ock. */.        
36920 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
36930 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
36940 73 65 20 7b 20 20 20 20 20 20 20 20 20 20 0a 20  se {          . 
36950 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
36960 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
36970 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 45 58  le, myHostID, EX
36980 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
36990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
369a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
369b0 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
369c0 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
369d0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
369e0 68 46 69 6c 65 2c 20 45 58 43 4c 55 53 49 56 45  hFile, EXCLUSIVE
369f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
36a00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36a20 20 20 20 63 68 61 72 20 77 72 69 74 65 42 75 66     char writeBuf
36a30 66 65 72 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  fer[PROXY_MAXCON
36a40 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
36a50 69 6e 74 20 77 72 69 74 65 53 69 7a 65 20 3d 20  int writeSize = 
36a60 30 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  0;.        .    
36a70 20 20 20 20 77 72 69 74 65 42 75 66 66 65 72 5b      writeBuffer[
36a80 30 5d 20 3d 20 28 63 68 61 72 29 50 52 4f 58 59  0] = (char)PROXY
36a90 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 3b 0a 20  _CONCHVERSION;. 
36aa0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 77         memcpy(&w
36ab0 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59  riteBuffer[PROXY
36ac0 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
36ad0 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53  ostID, PROXY_HOS
36ae0 54 49 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  TIDLEN);.       
36af0 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f 63 6b 50   if( pCtx->lockP
36b00 72 6f 78 79 50 61 74 68 21 3d 4e 55 4c 4c 20 29  roxyPath!=NULL )
36b10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 6c  {.          strl
36b20 63 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72  cpy(&writeBuffer
36b30 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  [PROXY_PATHINDEX
36b40 5d 2c 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ], pCtx->lockPro
36b50 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  xyPath, MAXPATHL
36b60 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  EN);.        }el
36b70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
36b80 72 6c 63 70 79 28 26 77 72 69 74 65 42 75 66 66  rlcpy(&writeBuff
36b90 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44  er[PROXY_PATHIND
36ba0 45 58 5d 2c 20 74 65 6d 70 4c 6f 63 6b 50 61 74  EX], tempLockPat
36bb0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
36bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36bd0 20 20 77 72 69 74 65 53 69 7a 65 20 3d 20 50 52    writeSize = PR
36be0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 2b 20  OXY_PATHINDEX + 
36bf0 73 74 72 6c 65 6e 28 26 77 72 69 74 65 42 75 66  strlen(&writeBuf
36c00 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  fer[PROXY_PATHIN
36c10 44 45 58 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  DEX]);.        r
36c20 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
36c30 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72  conchFile->h, wr
36c40 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  iteSize);.      
36c50 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65    rc = unixWrite
36c60 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
36c70 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74  )conchFile, writ
36c80 65 42 75 66 66 65 72 2c 20 77 72 69 74 65 53 69  eBuffer, writeSi
36c90 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
36ca0 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d  fsync(conchFile-
36cb0 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  >h);.        /* 
36cc0 49 66 20 77 65 20 63 72 65 61 74 65 64 20 61 20  If we created a 
36cd0 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28  new conch file (
36ce0 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74 65 64  not just updated
36cf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
36d00 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20   a .         ** 
36d10 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65  valid conch file
36d20 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ), try to match 
36d30 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
36d40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
36d50 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
36d60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36d70 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65  ITE_OK && create
36d80 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Conch ){.       
36d90 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
36da0 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  uf;.          in
36db0 74 20 65 72 72 20 3d 20 6f 73 46 73 74 61 74 28  t err = osFstat(
36dc0 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
36dd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
36de0 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
36df0 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64       mode_t cmod
36e00 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26  e = buf.st_mode&
36e10 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52  (S_IRUSR|S_IWUSR
36e20 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47   | S_IRGRP|S_IWG
36e30 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  RP |.           
36e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
36e60 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20  ROTH|S_IWOTH);. 
36e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
36e80 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64  y to match the d
36e90 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57  atabase file R/W
36ea0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67   permissions, ig
36eb0 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a  nore failure */.
36ec0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
36ed0 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20  ROXY_DEBUG.     
36ee0 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28         osFchmod(
36ef0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d  conchFile->h, cm
36f00 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ode);.#else.    
36f10 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
36f20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6f            rc = o
36f30 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68 46 69 6c  sFchmod(conchFil
36f40 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a 20 20  e->h, cmode);.  
36f50 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
36f60 28 20 72 63 3d 3d 28 2d 31 29 20 26 26 20 65 72  ( rc==(-1) && er
36f70 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
36f80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
36f90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
36fa0 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20       int code = 
36fb0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
36fc0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
36fd0 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
36fe0 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20 25  FAILED with %d %
36ff0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
37000 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f 64              cmod
37010 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72 6f  e, code, strerro
37020 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  r(code));.      
37030 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
37040 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
37050 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
37060 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45 44  hmod %o SUCCEDED
37070 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20 20  \n",cmode);.    
37080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
370a0 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20         int code 
370b0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
370c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
370d0 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c 45  err, "STAT FAILE
370e0 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25 73  D[%d] with %d %s
370f0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
37100 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20 63            err, c
37110 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f  ode, strerror(co
37120 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  de));.#endif.   
37130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37140 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
37150 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
37160 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71  hod->xUnlock((sq
37170 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
37180 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
37190 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  CK);.      .    
371a0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a 20  end_takeconch:. 
371b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
371c0 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53 45  RANSPROXY: CLOSE
371d0 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e    %d\n", pFile->
371e0 68 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  h));.      if( r
371f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
37200 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
37210 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
37220 66 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  fd;.        if( 
37230 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
37240 20 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f           robust_
37250 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
37260 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
37270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37280 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
37290 31 3b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20  1;.        fd = 
372a0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 43 74 78  robust_open(pCtx
372b0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2d  ->dbPath, pFile-
372c0 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a  >openFlags, 0);.
372d0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
372e0 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50  ("TRANSPROXY: OP
372f0 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b  EN  %d\n", fd));
37300 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 64 3e  .        if( fd>
37310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
37320 70 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20  pFile->h = fd;. 
37330 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
37340 20 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54          rc=SQLIT
37350 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
37360 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f   /* SQLITE_BUSY?
37370 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20   proxyTakeConch 
37380 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20  called.         
37390 20 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67    during locking
373a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
373b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
373c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
373d0 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   !pCtx->lockProx
373e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  y ){.        cha
373f0 72 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f  r *path = tempLo
37400 63 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63  ckPath ? tempLoc
37410 6b 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f  kPath : pCtx->lo
37420 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20  ckProxyPath;.   
37430 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43       rc = proxyC
37440 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61  reateUnixFile(pa
37450 74 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50  th, &pCtx->lockP
37460 72 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  roxy, 1);.      
37470 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37480 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
37490 45 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c  E_NOMEM && tryOl
374a0 64 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  dLockPath ){.   
374b0 20 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75         /* we cou
374c0 6c 64 6e 27 74 20 63 72 65 61 74 65 20 74 68 65  ldn't create the
374d0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
374e0 20 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f   with the old lo
374f0 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20  ck file path.   
37500 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72          ** so tr
37510 79 20 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f  y again via auto
37520 2d 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20  -naming .       
37530 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
37540 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74   forceNewLockPat
37550 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
37560 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
37570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 0;.          c
37580 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62  ontinue; /* go b
37590 61 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d  ack to the do {}
375a0 20 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69   while start poi
375b0 6e 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f  nt, try again */
375c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
375d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
375e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
375f0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
37600 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
37610 70 61 74 68 20 69 66 20 77 65 20 65 78 74 72 61  path if we extra
37620 63 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20  cted the value. 
37630 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20          ** from 
37640 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f  the conch file o
37650 72 20 74 68 65 20 70 61 74 68 20 77 61 73 20 61  r the path was a
37660 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
37670 73 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a  stack.         *
37680 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  /.        if( te
37690 6d 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  mpLockPath ){.  
376a0 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f          pCtx->lo
376b0 63 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71  ckProxyPath = sq
376c0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
376d0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a   tempLockPath);.
376e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
376f0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
37700 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
37710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
37720 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
37730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37740 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
37750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37760 20 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63        pCtx->conc
37770 68 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  hHeld = 1;.     
37780 20 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20     .        if( 
37790 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d  pCtx->lockProxy-
377a0 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70  >pMethod == &afp
377b0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
377c0 20 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e         afpLockin
377d0 67 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78  gContext *afpCtx
377e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43  ;.          afpC
377f0 74 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  tx = (afpLocking
37800 43 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e  Context *)pCtx->
37810 6c 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69  lockProxy->locki
37820 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  ngContext;.     
37830 20 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50       afpCtx->dbP
37840 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath = pCtx->lock
37850 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
37860 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
37870 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63  e {.        conc
37880 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
37890 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
378a0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
378b0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
378c0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
378d0 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E(("TAKECONCH  %
378e0 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69  d %s\n", conchFi
378f0 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
37900 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
37910 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64  _OK?"ok":"failed
37920 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
37930 6e 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c  n rc;.    } whil
37940 65 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73  e (1); /* in cas
37950 65 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74  e we need to ret
37960 72 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f  ry the :auto: lo
37970 63 6b 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20  ck file - .     
37980 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
37990 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67  e should never g
379a0 65 74 20 68 65 72 65 20 65 78 63 65 70 74 20 76  et here except v
379b0 69 61 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65  ia the 'continue
379c0 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d  ' call. */.  }.}
379d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65  ../*.** If pFile
379e0 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e   holds a lock on
379f0 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74   a conch file, t
37a00 68 65 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74  hen release that
37a10 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
37a20 20 69 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73   int proxyReleas
37a30 65 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20  eConch(unixFile 
37a40 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
37a50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
37a60 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
37a70 74 69 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65  tine return code
37a80 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69   */.  proxyLocki
37a90 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
37aa0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67    /* The locking
37ab0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   context for the
37ac0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20   proxy lock */. 
37ad0 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68   unixFile *conch
37ae0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  File;        /* 
37af0 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  Name of the conc
37b00 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74  h file */..  pCt
37b10 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
37b20 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
37b30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37b40 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20  ;.  conchFile = 
37b50 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b  pCtx->conchFile;
37b60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c  .  OSTRACE(("REL
37b70 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f  EASECONCH  %d fo
37b80 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  r %s pid=%d\n", 
37b90 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20  conchFile->h,.  
37ba0 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e           (pCtx->
37bb0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20  lockProxyPath ? 
37bc0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
37bd0 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c  ath : ":auto:"),
37be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 67 65 74   .           get
37bf0 70 69 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70  pid()));.  if( p
37c00 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30  Ctx->conchHeld>0
37c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e   ){.    rc = con
37c20 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
37c30 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
37c40 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
37c50 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  e, NO_LOCK);.  }
37c60 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65  .  pCtx->conchHe
37c70 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43  ld = 0;.  OSTRAC
37c80 45 28 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48  E(("RELEASECONCH
37c90 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63    %d %s\n", conc
37ca0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
37cb0 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45       (rc==SQLITE
37cc0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
37cd0 69 6c 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75  iled")));.  retu
37ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37cf0 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
37d00 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
37d10 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e  e, compute the n
37d20 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68  ame of its conch
37d30 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20   file..** Store 
37d40 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61  the conch filena
37d50 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  me in memory obt
37d60 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
37d70 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
37d80 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68  Make *pConchPath
37d90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
37da0 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  w name.  Return 
37db0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
37dc0 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  cess.** or SQLIT
37dd0 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c  E_NOMEM if unabl
37de0 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f  e to obtain memo
37df0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ry..**.** The ca
37e00 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
37e10 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ble for ensuring
37e20 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
37e30 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70  ted memory.** sp
37e40 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ace is eventuall
37e50 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a  y freed..**.** *
37e60 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65  pConchPath is se
37e70 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d  t to NULL if a m
37e80 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
37e90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
37ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37eb0 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74  xyCreateConchPat
37ec0 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61  hname(char *dbPa
37ed0 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63  th, char **pConc
37ee0 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b  hPath){.  int i;
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
37f10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
37f20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
37f30 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c  en(dbPath); /* L
37f40 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61 73  ength of databas
37f50 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50  e filename - dbP
37f60 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ath */.  char *c
37f70 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20 20  onchPath;       
37f80 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72         /* buffer
37f90 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e   in which to con
37fa0 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d  struct conch nam
37fb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
37fc0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
37fd0 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
37fe0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
37ff0 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a  the name to.  **
38000 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
38010 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
38020 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20  se file. */  .  
38030 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f  *pConchPath = co
38040 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72 20  nchPath = (char 
38050 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
38060 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28  (len + 8);.  if(
38070 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b   conchPath==0 ){
38080 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
38090 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
380a0 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68  memcpy(conchPath
380b0 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29  , dbPath, len+1)
380c0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e  ;.  .  /* now in
380d0 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72  sert a "." befor
380e0 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61  e the last / cha
380f0 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  racter */.  for(
38100 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30   i=(len-1); i>=0
38110 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28  ; i-- ){.    if(
38120 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27   conchPath[i]=='
38130 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  /' ){.      i++;
38140 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
38150 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50    }.  }.  conchP
38160 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68  ath[i]='.';.  wh
38170 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20  ile ( i<len ){. 
38180 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31     conchPath[i+1
38190 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20  ]=dbPath[i];.   
381a0 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
381b0 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e  append the "-con
381c0 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74 68  ch" suffix to th
381d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63  e file */.  memc
381e0 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b  py(&conchPath[i+
381f0 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29  1], "-conch", 7)
38200 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 74  ;.  assert( (int
38210 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74  )strlen(conchPat
38220 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a  h) == len+7 );..
38230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38240 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73  OK;.}.../* Takes
38250 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75   a fully configu
38260 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  red proxy lockin
38270 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c  g-style unix fil
38280 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a  e and switches.*
38290 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  * the local lock
382a0 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73   file path .*/.s
382b0 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63 68  tatic int switch
382c0 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e  LockProxyPath(un
382d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
382e0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
382f0 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
38300 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
38310 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
38320 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f  ntext*)pFile->lo
38330 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
38340 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20  char *oldPath = 
38350 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
38360 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ath;.  int rc = 
38370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
38380 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
38390 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck!=NO_LOCK ){. 
383a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
383b0 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20  _BUSY;.  }  ..  
383c0 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
383d0 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20   if the path is 
383e0 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20  NULL, :auto: or 
383f0 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73  matches the exis
38400 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69  ting path */.  i
38410 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
38420 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
38430 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
38440 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64  o:") ||.    (old
38450 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70  Path && !strncmp
38460 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20  (oldPath, path, 
38470 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a  MAXPATHLEN)) ){.
38480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
38490 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
384a0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
384b0 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
384c0 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43  ockProxy;.    pC
384d0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55  tx->lockProxy=NU
384e0 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f  LL;.    pCtx->co
384f0 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20  nchHeld = 0;.   
38500 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d   if( lockProxy!=
38510 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
38520 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  =lockProxy->pMet
38530 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
38540 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b  ite3_file *)lock
38550 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
38560 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
38570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
38580 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
38590 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.