/ Hex Artifact Content
Login

Artifact 3894d0620bfdc1bb00edbfd9ad773141ec0369ee:


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 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1a40: 20 75 6e 69 78 4d 61 70 70 69 6e 67 20 75 6e 69   unixMapping uni
1a50: 78 4d 61 70 70 69 6e 67 3b 0a 73 74 72 75 63 74  xMapping;.struct
1a60: 20 75 6e 69 78 4d 61 70 70 69 6e 67 20 7b 0a 20   unixMapping {. 
1a70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1a80: 6d 61 70 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  mapSize;.  sqlit
1a90: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4f 72 69  e3_int64 mmapOri
1aa0: 67 73 69 7a 65 3b 0a 20 20 76 6f 69 64 20 2a 70  gsize;.  void *p
1ab0: 4d 61 70 52 65 67 69 6f 6e 3b 0a 7d 3b 0a 0a 0a  MapRegion;.};...
1ac0: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1ad0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1ae0: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1af0: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
1b00: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
1b10: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1b20: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
1b30: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
1b40: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
1b50: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1b60: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1b70: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1b80: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1b90: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1ba0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1bb0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
1bc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
1bd0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
1be0: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  is unixFile */. 
1bf0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
1c00: 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
1c10: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f       /* Info abo
1c20: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
1c30: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
1c40: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1c70: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  riptor */.  unsi
1c80: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
1c90: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1ca0: 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c  /* The type of l
1cb0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  ock held on this
1cc0: 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   fd */.  unsigne
1cd0: 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c  d short int ctrl
1ce0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20  Flags;       /* 
1cf0: 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e  Behavioral bits.
1d00: 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61    UNIXFILE_* fla
1d10: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  gs */.  int last
1d20: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d40: 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72  he unix errno fr
1d50: 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  om last I/O erro
1d60: 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  r */.  void *loc
1d70: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
1d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d90: 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63  cking style spec
1da0: 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20  ific state */.  
1db0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
1dc0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
1dd0: 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1de0: 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46  ated UnixUnusedF
1df0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e00: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20  r *zPath;       
1e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1e20: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
1e30: 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68  /.  unixShm *pSh
1e40: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1e50: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1e60: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1e70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1e80: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1eb0: 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55  red by FCNTL_CHU
1ec0: 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 20 20 69 6e 74  NK_SIZE */.  int
1ed0: 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20   nFetchOut;     
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1f00: 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1f10: 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74   refs */.  sqlit
1f20: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 4c 69 6d  e3_int64 mmapLim
1f30: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  it;            /
1f40: 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e  * Configured FCN
1f50: 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 20 76 61  TL_MMAP_LIMIT va
1f60: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  lue */.  int szS
1f70: 79 73 70 61 67 65 3b 20 20 20 20 20 20 20 20 20  yspage;         
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f90: 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  System page size
1fa0: 20 2a 2f 0a 20 20 75 6e 69 78 4d 61 70 70 69 6e   */.  unixMappin
1fb0: 67 20 61 4d 6d 61 70 5b 32 5d 3b 20 20 20 20 20  g aMmap[2];     
1fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 20            /* Up 
1fd0: 74 6f 20 74 77 6f 20 6d 65 6d 6f 72 79 20 6d 61  to two memory ma
1fe0: 70 70 65 64 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  pped regions */.
1ff0: 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
2000: 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  __.  int sectorS
2010: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2020: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
2030: 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a  ce sector size *
2040: 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43 68  /.  int deviceCh
2050: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
2060: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 6f          /* Preco
2070: 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63 68  mputed device ch
2080: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
2090: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
20a0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
20b0: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
20c0: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e0: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
20f0: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
2100: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
2110: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2120: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
2130: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
2140: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
2150: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2160: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
2170: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
2180: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
2190: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
21a0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
21b0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20  leId *pId;      
21c0: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
21d0: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
21e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21f0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
2200: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
2210: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
2220: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
2230: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
2240: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
2250: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
2260: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
2270: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
2280: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
2290: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
22a0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
22b0: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
22c0: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
22d0: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
22e0: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
22f0: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
2300: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
2310: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
2320: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
2330: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
2340: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
2350: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
2360: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
2370: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
2380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
2390: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
23a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
23b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
23c0: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
23d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
23e0: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
23f0: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
2400: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
2410: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
2420: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
2430: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
2440: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
2450: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
2460: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69  ration */..#endi
2470: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2480: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2490: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
24a0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
24b0: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
24c0: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
24d0: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
24e0: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
24f0: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
2500: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
2510: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
2520: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
2530: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
2540: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
2550: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
2560: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2570: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2580: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2590: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
25a0: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
25b0: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
25c0: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
25d0: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
25e0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
25f0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2600: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2610: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
2620: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
2630: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
2640: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2650: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
2660: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2670: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2680: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2690: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
26a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
26b0: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
26c0: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
26d0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
26e0: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
26f0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
2700: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
2710: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
2720: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
2730: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
2740: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
2750: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
2760: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2770: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2780: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2790: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
27a0: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
27b0: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
27c0: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
27d0: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
27e0: 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  king */../*.** I
27f0: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
2800: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
2810: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
2820: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
2830: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
2840: 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d  Define various m
2850: 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d  acros that are m
2860: 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65  issing from some
2870: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
2880: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
2890: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
28a0: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
28b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  ifdef SQLITE_DIS
28c0: 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66  ABLE_LFS.# undef
28d0: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64   O_LARGEFILE.# d
28e0: 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c  efine O_LARGEFIL
28f0: 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  E 0.#endif.#ifnd
2900: 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20  ef O_NOFOLLOW.# 
2910: 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f  define O_NOFOLLO
2920: 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  W 0.#endif.#ifnd
2930: 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65  ef O_BINARY.# de
2940: 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a  fine O_BINARY 0.
2950: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2960: 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f  e threadid macro
2970: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65   resolves to the
2980: 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f   thread-id or to
2990: 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a   0.  Used for.**
29a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
29b0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
29c0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
29d0: 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68  DSAFE.#define th
29e0: 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73  readid pthread_s
29f0: 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66  elf().#else.#def
2a00: 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23  ine threadid 0.#
2a10: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
2a20: 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29  ned(HAVE_MREMAP)
2a30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  .#if defined(__l
2a40: 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
2a50: 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a  ed(_GNU_SOURCE).
2a60: 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52  # define HAVE_MR
2a70: 45 4d 41 50 20 31 0a 23 65 6c 73 65 0a 23 20 64  EMAP 1.#else.# d
2a80: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2a90: 50 20 30 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  P 0.#endif.#endi
2aa0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65  f../*.** Differe
2ab0: 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20  nt Unix systems 
2ac0: 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69  declare open() i
2ad0: 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  n different ways
2ae0: 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f  .  Same use.** o
2af0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2b00: 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74  int,mode_t).  Ot
2b10: 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f  hers use open(co
2b20: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e  nst char*,int,..
2b30: 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .)..** The diffe
2b40: 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61  rence is importa
2b50: 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20  nt when using a 
2b60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
2b70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
2b80: 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f  he safest way to
2b90: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70   deal with the p
2ba0: 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77  roblem is to alw
2bb0: 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61  ays use this wra
2bc0: 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c  pper.** which al
2bd0: 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d  ways has the sam
2be0: 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69  e well-defined i
2bf0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
2c00: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65  tic int posixOpe
2c10: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
2c20: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20  ile, int flags, 
2c30: 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74  int mode){.  ret
2c40: 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  urn open(zFile, 
2c50: 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a  flags, mode);.}.
2c60: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  ./*.** On some s
2c70: 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f  ystems, calls to
2c80: 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74   fchown() will t
2c90: 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65  rigger a message
2ca0: 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a   in a security.*
2cb0: 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f  * log if they co
2cc0: 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74  me from non-root
2cd0: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20   processes.  So 
2ce0: 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63  avoid calling fc
2cf0: 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20  hown() if.** we 
2d00: 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
2d10: 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74  as root..*/.stat
2d20: 69 63 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f  ic int posixFcho
2d30: 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74  wn(int fd, uid_t
2d40: 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29   uid, gid_t gid)
2d50: 7b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 65 75  {.  return geteu
2d60: 69 64 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77  id() ? 0 : fchow
2d70: 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 7d  n(fd,uid,gid);.}
2d80: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2d90: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2da0: 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f   int openDirecto
2db0: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  ry(const char*, 
2dc0: 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  int*);../*.** Ma
2dd0: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
2de0: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
2df0: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
2e00: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
2e10: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
2e20: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
2e30: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
2e40: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
2e50: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
2e60: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
2e70: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
2e80: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
2e90: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
2ea0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
2eb0: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
2ec0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
2ed0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
2ee0: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
2ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2f00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2f10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
2f20: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
2f30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f40: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
2f50: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
2f60: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2f70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2f80: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2f90: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2fa0: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2fb0: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
2fc0: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
2fd0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2fe0: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
2ff0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
3000: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
3010: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
3020: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
3030: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3040: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
3050: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3060: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
3070: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3080: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
3090: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
30a0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
30b0: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
30c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
30d0: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
30e0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
30f0: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
3100: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3110: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
3120: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
3130: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
3140: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3150: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
3160: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3170: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
3180: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
3190: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
31a0: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
31b0: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
31c0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
31d0: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
31e0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
31f0: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
3200: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3210: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
3220: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
3230: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
3240: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
3250: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
3260: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
3270: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
3280: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
3290: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
32a0: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
32b0: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
32c0: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
32d0: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
32e0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
32f0: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
3300: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
3310: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
3320: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
3330: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
3340: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
3350: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
3360: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
3370: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3380: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
3390: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
33a0: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
33b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
33c0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
33d0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
33e0: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
33f0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
3400: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
3410: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3420: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
3430: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
3440: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3450: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
3460: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
3470: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
3480: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
3490: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
34a0: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
34b0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
34c0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
34d0: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
34e0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
34f0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3500: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
3510: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
3520: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
3530: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3540: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
3550: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3560: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
3570: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
3580: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3590: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
35a0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
35b0: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
35c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
35d0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
35e0: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
35f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3600: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
3610: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3620: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
3630: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3640: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3650: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3660: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
3670: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3680: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
3690: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
36a0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
36b0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
36c0: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
36d0: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
36e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
36f0: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
3700: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
3710: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
3720: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3730: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3740: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3750: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
3760: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3770: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3780: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
3790: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
37a0: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
37b0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
37c0: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
37d0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
37e0: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
37f0: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
3800: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
3810: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
3820: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3830: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
3840: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
3850: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
3860: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3870: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3880: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
3890: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
38a0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
38b0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
38c0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
38d0: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
38e0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
38f0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3900: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3910: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
3920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3930: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
3940: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3950: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3960: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
3970: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3980: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3990: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
39a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
39b0: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
39c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
39d0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
39e0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
39f0: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
3a00: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
3a10: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
3a20: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3a40: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3a50: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3a60: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3a70: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3a80: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
3a90: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
3aa0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
3ab0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
3ac0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
3ad0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
3ae0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
3af0: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
3b00: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
3b10: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
3b20: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3b30: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
3b40: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
3b50: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
3b60: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
3b70: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3b90: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3ba0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
3bb0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
3bc0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3bd0: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
3be0: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
3bf0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3c00: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
3c10: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c20: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
3c30: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c40: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3c50: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
3c60: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
3c70: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
3c80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
3c90: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
3ca0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3cb0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
3cc0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3cd0: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
3ce0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
3cf0: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
3d00: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3d10: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
3d20: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
3d30: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
3d40: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3d50: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
3d60: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3d70: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3d80: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
3d90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3da0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
3db0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3dc0: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
3dd0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3de0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
3df0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3e00: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
3e10: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3e20: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
3e30: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3e40: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
3e50: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
3e60: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
3e70: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3e80: 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20    { "mmap",     
3e90: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3ea0: 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20 20  ll_ptr)mmap,    
3eb0: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3ec0: 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  Mmap ((void*(*)(
3ed0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74  void*,size_t,int
3ee0: 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29  ,int,int,off_t))
3ef0: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
3f00: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e  rrent)..  { "mun
3f10: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
3f20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3f30: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
3f40: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3f50: 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMunmap ((void*(
3f60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29  *)(void*,size_t)
3f70: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
3f80: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56  urrent)..#if HAV
3f90: 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72  E_MREMAP.  { "mr
3fa0: 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  emap",       (sq
3fb0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3fc0: 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20 20  r)mremap,       
3fd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3fe0: 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20  { "mremap",     
3ff0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
4000: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
4010: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4020: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72  dif.#define osMr
4030: 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  emap ((void*(*)(
4040: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a  void*,size_t,siz
4050: 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  e_t,int,...))aSy
4060: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
4070: 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f  nt)..}; /* End o
4080: 66 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62  f the overrideab
4090: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  le system calls 
40a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
40b0: 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d  s the xSetSystem
40c0: 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66  Call() method of
40d0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72   sqlite3_vfs for
40e0: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22   all of the.** "
40f0: 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52 65  unix" VFSes.  Re
4100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
4110: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
4120: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
4130: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
4140: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
4150: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
4160: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
4170: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
4180: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
4190: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
41a0: 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixSetSystemCall
41b0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
41c0: 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  *pNotUsed,      
41d0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69    /* The VFS poi
41e0: 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20  nter.  Not used 
41f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4200: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
4210: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79     /* Name of sy
4220: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65  stem call to ove
4230: 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  rride */.  sqlit
4240: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
4250: 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e  NewFunc  /* Poin
4260: 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65  ter to new syste
4270: 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a  m call value */.
4280: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
4290: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
42a0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
42b0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
42c0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
42d0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
42e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a  {.    /* If no z
42f0: 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72  Name is given, r
4300: 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65  estore all syste
4310: 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72  m calls to their
4320: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
4330: 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74  settings and ret
4340: 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a  urn NULL.    */.
4350: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4360: 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  OK;.    for(i=0;
4370: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
4380: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
4390: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
43a0: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
43b0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b  l[i].pDefault ){
43c0: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
43d0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
43e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
43f0: 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ault;.      }.  
4400: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4410: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
4420: 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61  specified, opera
4430: 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f  te on only the o
4440: 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20  ne system call. 
4450: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e     ** specified.
4460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
4470: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4480: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4490: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
44a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
44b0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
44c0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
44d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
44e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
44f0: 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ault==0 ){.     
4500: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
4510: 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73  .pDefault = aSys
4520: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
4530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4540: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4550: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
4560: 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e  pNewFunc==0 ) pN
4570: 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c  ewFunc = aSyscal
4580: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
4590: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
45a0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e  i].pCurrent = pN
45b0: 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  ewFunc;.        
45c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
45d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
45e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
45f0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
4600: 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  of a system call
4610: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4620: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61  f zName is not a
4630: 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73  .** recognized s
4640: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e  ystem call name.
4650: 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72    NULL is also r
4660: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73  eturned if the s
4670: 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73  ystem call.** is
4680: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66   currently undef
4690: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
46a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
46b0: 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74 65  ptr unixGetSyste
46c0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
46d0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a  _vfs *pNotUsed,.
46e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
46f0: 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ame.){.  unsigne
4700: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53  d int i;..  UNUS
4710: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
4720: 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d  tUsed);.  for(i=
4730: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
4740: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
4750: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
4760: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
4770: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
4780: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  i].zName)==0 ) r
4790: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
47a0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a  ].pCurrent;.  }.
47b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
47c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
47d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
47e0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66  t system call af
47f0: 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a  ter zName.  If z
4800: 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68  Name==NULL.** th
4810: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61  en return the na
4820: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
4830: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
4840: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
4850: 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  me.** is the las
4860: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72  t system call or
4870: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
4880: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
4890: 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63  alid.** system c
48a0: 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  all..*/.static c
48b0: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 4e  onst char *unixN
48c0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
48d0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
48e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
48f0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
4900: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4910: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
4920: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
4930: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
4940: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
4950: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
4960: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
4970: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
4980: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
4990: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
49a0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
49b0: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
49c0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
49d0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
49e0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
49f0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
4a00: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a10: 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20   Invoke open(). 
4a20: 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20   Do so multiple 
4a30: 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20  times, until it 
4a40: 65 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20  either succeeds 
4a50: 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20  or.** fails for 
4a60: 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65  some reason othe
4a70: 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a  r than EINTR..**
4a80: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
4a90: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d  creation mode "m
4aa0: 22 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20  " is 0 then set 
4ab0: 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  it to the defaul
4ac0: 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e  t for.** SQLite.
4ad0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
4ae0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
4af0: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
4b00: 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36   (normally.** 06
4b10: 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20  44) as modified 
4b20: 62 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d  by the system um
4b30: 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f  ask.  If m is no
4b40: 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b  t 0, then.** mak
4b50: 65 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74  e the file creat
4b60: 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63  ion mode be exac
4b70: 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74  tly m ignoring t
4b80: 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  he umask..**.** 
4b90: 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20  The m parameter 
4ba0: 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  will be non-zero
4bb0: 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74   only when creat
4bc0: 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e  ing -wal, -journ
4bd0: 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20  al,.** and -shm 
4be0: 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20  files.  We want 
4bf0: 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68  those files to h
4c00: 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68  ave *exactly* th
4c10: 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73  e same.** permis
4c20: 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f  sions as their o
4c30: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
4c40: 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20  , unadulterated 
4c50: 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
4c60: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66   In that way, if
4c70: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
4c80: 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72   is -rw-rw-rw or
4c90: 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20   -rw-rw-r-, and 
4ca0: 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  a.** transaction
4cb0: 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61   crashes and lea
4cc0: 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a  ves behind hot j
4cd0: 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e  ournals, then an
4ce0: 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  y.** process tha
4cf0: 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69  t is able to wri
4d00: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
4d10: 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20  se will also be 
4d20: 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76  able to.** recov
4d30: 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  er the hot journ
4d40: 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  als..*/.static i
4d50: 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63  nt robust_open(c
4d60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
4d70: 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a  t f, mode_t m){.
4d80: 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65    int fd;.  mode
4d90: 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20  _t m2 = m ? m : 
4da0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
4db0: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b  ILE_PERMISSIONS;
4dc0: 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e  .  do{.#if defin
4dd0: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20  ed(O_CLOEXEC).  
4de0: 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c    fd = osOpen(z,
4df0: 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b  f|O_CLOEXEC,m2);
4e00: 0a 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20  .#else.    fd = 
4e10: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a  osOpen(z,f,m2);.
4e20: 23 65 6e 64 69 66 0a 20 20 7d 77 68 69 6c 65 28  #endif.  }while(
4e30: 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   fd<0 && errno==
4e40: 45 49 4e 54 52 20 29 3b 0a 20 20 69 66 28 20 66  EINTR );.  if( f
4e50: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d>=0 ){.    if( 
4e60: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  m!=0 ){.      st
4e70: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
4e80: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
4e90: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
4ea0: 66 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  f)==0 .       &&
4eb0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
4ec0: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73  ==0.       && (s
4ed0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30  tatbuf.st_mode&0
4ee0: 37 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29  777)!=m .      )
4ef0: 7b 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d  {.        osFchm
4f00: 6f 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20  od(fd, m);.     
4f10: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66   }.    }.#if def
4f20: 69 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29  ined(FD_CLOEXEC)
4f30: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f   && (!defined(O_
4f40: 43 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c  CLOEXEC) || O_CL
4f50: 4f 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73  OEXEC==0).    os
4f60: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
4f70: 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
4f80: 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
4f90: 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
4fa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64  .  }.  return fd
4fb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
4fc0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
4fd0: 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
4fe0: 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
4ff0: 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
5000: 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
5010: 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
5020: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
5030: 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69  and.** vxworksFi
5040: 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65  leId objects use
5050: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20  d by this file, 
5060: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
5070: 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62   be .** shared b
5080: 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
5090: 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
50a0: 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  on unixMutexHeld
50b0: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
50c0: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
50d0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
50e0: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
50f0: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
5100: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
5110: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
5120: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
5130: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
5140: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  *   unixEnterMut
5150: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
5160: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
5170: 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78  d() );.**   unix
5180: 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a  EnterLeave().*/.
5190: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
51a0: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
51b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
51c0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
51d0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
51e0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
51f0: 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
5200: 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d   void unixLeaveM
5210: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
5220: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
5230: 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
5240: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5250: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
5260: 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
5270: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5280: 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  nt unixMutexHeld
5290: 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
52a0: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
52b0: 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
52c0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
52d0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
52e0: 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  R));.}.#endif...
52f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5300: 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
5310: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5320: 29 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  )./*.** Helper f
5330: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
5340: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
5350: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
5360: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
5370: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
5380: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
5390: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
53a0: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
53b0: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
53c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
53d0: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
53e0: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
53f0: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
5400: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
5410: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
5420: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
5430: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
5440: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
5450: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
5460: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
5470: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5480: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
5490: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
54a0: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
54b0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
54c0: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
54d0: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
54e0: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
54f0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
5500: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
5510: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
5520: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
5530: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
5540: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
5550: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5560: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
5570: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
5580: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
5590: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
55a0: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
55b0: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
55c0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
55d0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
55e0: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
55f0: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
5600: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
5610: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
5620: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
5630: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
5640: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
5650: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
5660: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
5670: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
5680: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
5690: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
56a0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
56b0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
56c0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
56d0: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
56e0: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
56f0: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
5700: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
5710: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
5720: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
5730: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
5740: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
5750: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
5760: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5770: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
5780: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5790: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
57a0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
57b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
57c0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
57d0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
57e0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
57f0: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
5800: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5810: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
5820: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
5830: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
5840: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5850: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
5860: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
5870: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5880: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
5890: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
58a0: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
58b0: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
58c0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
58d0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
58e0: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
58f0: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
5900: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
5910: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
5920: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
5930: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
5940: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
5950: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
5960: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
5970: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
5980: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
5990: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
59a0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
59b0: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
59c0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
59d0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
59e0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
59f0: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5a00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5a10: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5a20: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5a30: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
5a40: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5a50: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
5a60: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5a70: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
5a80: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
5a90: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
5aa0: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
5ab0: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
5ac0: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
5ad0: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
5ae0: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
5af0: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
5b00: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
5b10: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
5b20: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
5b30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
5b40: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
5b50: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
5b60: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
5b70: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
5b80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
5b90: 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69  bust_ftruncate(i
5ba0: 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e  nt h, sqlite3_in
5bb0: 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72  t64 sz){.  int r
5bc0: 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  c;.  do{ rc = os
5bd0: 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b  Ftruncate(h,sz);
5be0: 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
5bf0: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
5c00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5c10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5c20: 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61  ine translates a
5c30: 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20   standard POSIX 
5c40: 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20  errno code into 
5c50: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65  something.** use
5c60: 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ful to the clien
5c70: 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ts of the sqlite
5c80: 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70  3 functions.  Sp
5c90: 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69  ecifically, it i
5ca0: 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f  s.** intended to
5cb0: 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72   translate a var
5cc0: 69 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61  iety of "try aga
5cd0: 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  in" errors into 
5ce0: 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61  SQLITE_BUSY.** a
5cf0: 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  nd a variety of 
5d00: 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68  "please close th
5d10: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
5d20: 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e  r NOW" errors in
5d30: 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  to .** SQLITE_IO
5d40: 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72  ERR.** .** Error
5d50: 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c  s during initial
5d60: 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  ization of locks
5d70: 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d  , or file system
5d80: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63   support for loc
5d90: 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61  ks,.** should ha
5da0: 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f  ndle ENOLCK, ENO
5db0: 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50  TSUP, EOPNOTSUPP
5dc0: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a   separately..*/.
5dd0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
5de0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
5df0: 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72  rror(int posixEr
5e00: 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49  ror, int sqliteI
5e10: 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68  OErr) {.  switch
5e20: 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a   (posixError) {.
5e30: 23 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e  #if 0.  /* At on
5e40: 65 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64  e point this cod
5e50: 65 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e  e was not commen
5e60: 74 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f  ted out. In theo
5e70: 72 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a  ry, this branch.
5e80: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65    ** should neve
5e90: 72 20 62 65 20 68 69 74 2c 20 61 73 20 74 68 69  r be hit, as thi
5ea0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
5eb0: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
5ec0: 20 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f   after.  ** a lo
5ed0: 63 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75  cking-related fu
5ee0: 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e  nction (i.e. fcn
5ef0: 74 6c 28 29 29 20 68 61 73 20 72 65 74 75 72 6e  tl()) has return
5f00: 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68  ed non-zero with
5f10: 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
5f20: 6f 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20  of errno as the 
5f30: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
5f40: 53 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63  Since a system c
5f50: 61 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a  all has failed,.
5f60: 20 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c    ** errno shoul
5f70: 64 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20  d be non-zero.. 
5f80: 20 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65   **.  ** Despite
5f90: 20 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20   this, if errno 
5fa0: 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20  really is zero, 
5fb0: 77 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77  we still don't w
5fc0: 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20  ant to return.  
5fd0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  ** SQLITE_OK. Th
5fe0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61  e system call fa
5ff0: 69 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a  iled, and *some*
6000: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68   SQLite error sh
6010: 6f 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f  ould be.  ** pro
6020: 70 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20  pagated back to 
6030: 74 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d  the caller. Comm
6040: 65 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e  enting this bran
6050: 63 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72  ch out means err
6060: 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20  no==0.  ** will 
6070: 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
6080: 65 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73  e "default:" cas
6090: 65 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  e below..  */.  
60a0: 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74  case 0: .    ret
60b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
60c0: 65 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41  endif..  case EA
60d0: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
60e0: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
60f0: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
6100: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
6110: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
6120: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
6130: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
6140: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
6150: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
6160: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6170: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
6180: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
6190: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
61a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
61b0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43 43      .  case EACC
61c0: 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43  ES: .    /* EACC
61d0: 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49  ES is like EAGAI
61e0: 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67  N during locking
61f0: 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74   operations, but
6200: 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74   not any other t
6210: 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73  ime*/.    if( (s
6220: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
6230: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
6240: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71   || .        (sq
6250: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6260: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
6270: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73  ) || .        (s
6280: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
6290: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
62a0: 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73  K) ||.        (s
62b0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
62c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
62d0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b  RESERVEDLOCK) ){
62e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
62f0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
6300: 0a 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c  .    /* else fal
6310: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63  l through */.  c
6320: 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20  ase EPERM: .    
6330: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
6340: 52 4d 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 45 44  RM;.    .  /* ED
6350: 45 41 44 4c 4b 20 69 73 20 6f 6e 6c 79 20 70 6f  EADLK is only po
6360: 73 73 69 62 6c 65 20 69 66 20 61 20 63 61 6c 6c  ssible if a call
6370: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
6380: 4b 57 29 20 69 73 20 6d 61 64 65 2e 20 41 6e 64  KW) is made. And
6390: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c  .  ** this modul
63a0: 65 20 6e 65 76 65 72 20 6d 61 6b 65 73 20 73 75  e never makes su
63b0: 63 68 20 61 20 63 61 6c 6c 2e 20 41 6e 64 20 74  ch a call. And t
63c0: 68 65 20 63 6f 64 65 20 69 6e 20 53 51 4c 69 74  he code in SQLit
63d0: 65 20 69 74 73 65 6c 66 20 0a 20 20 2a 2a 20 61  e itself .  ** a
63e0: 73 73 65 72 74 73 20 74 68 61 74 20 53 51 4c 49  sserts that SQLI
63f0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
6400: 20 69 73 20 6e 65 76 65 72 20 72 65 74 75 72 6e   is never return
6410: 65 64 2e 20 46 6f 72 20 74 68 65 73 65 20 72 65  ed. For these re
6420: 61 73 6f 6e 73 0a 20 20 2a 2a 20 74 68 69 73 20  asons.  ** this 
6430: 63 61 73 65 20 69 73 20 61 6c 73 6f 20 63 6f 6d  case is also com
6440: 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 66 20 74  mented out. If t
6450: 68 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  he system does s
6460: 65 74 20 65 72 72 6e 6f 20 74 6f 20 45 44 45 41  et errno to EDEA
6470: 44 4c 4b 2c 0a 20 20 2a 2a 20 74 68 65 20 64 65  DLK,.  ** the de
6480: 66 61 75 6c 74 20 53 51 4c 49 54 45 5f 49 4f 45  fault SQLITE_IOE
6490: 52 52 5f 58 58 58 20 63 6f 64 65 20 77 69 6c 6c  RR_XXX code will
64a0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f   be returned. */
64b0: 0a 23 69 66 20 30 0a 20 20 63 61 73 65 20 45 44  .#if 0.  case ED
64c0: 45 41 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72  EADLK:.    retur
64d0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  n SQLITE_IOERR_B
64e0: 4c 4f 43 4b 45 44 3b 0a 23 65 6e 64 69 66 0a 20  LOCKED;.#endif. 
64f0: 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55     .#if EOPNOTSU
6500: 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61  PP!=ENOTSUP.  ca
6510: 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a  se EOPNOTSUPP: .
6520: 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67      /* something
6530: 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61   went terribly a
6540: 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  wry, unless duri
6550: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
6560: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
6570: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
6580: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
6590: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
65a0: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
65b0: 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20  #ifdef ENOTSUP. 
65c0: 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a   case ENOTSUP: .
65d0: 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66      /* invalid f
65e0: 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  d, unless during
65f0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
6600: 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69  port introspecti
6610: 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20  on, in which .  
6620: 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79     * it actually
6630: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
6640: 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ays */.#endif.  
6650: 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65  case EIO:.  case
6660: 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45   EBADF:.  case E
6670: 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e  INVAL:.  case EN
6680: 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45  OTCONN:.  case E
6690: 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e  NODEV:.  case EN
66a0: 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45  XIO:.  case ENOE
66b0: 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c  NT:.#ifdef ESTAL
66c0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
66d0: 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20        /* ESTALE 
66e0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f  is not defined o
66f0: 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d  n Interix system
6700: 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41  s */.  case ESTA
6710: 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73  LE:.#endif.  cas
6720: 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a  e ENOSYS:.    /*
6730: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f   these should fo
6740: 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74  rce the client t
6750: 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  o close the file
6760: 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a   and reconnect *
6770: 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  /.    .  default
6780: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
6790: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
67a0: 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
67b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67f0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
6800: 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69  ****** Begin Uni
6810: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
6820: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
6830: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
6840: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73  ***.**.** On mos
6850: 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e  t versions of un
6860: 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61  ix, we can get a
6870: 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61   unique ID for a
6880: 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65   file by concate
6890: 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65  nating.** the de
68a0: 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  vice number and 
68b0: 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72  the inode number
68c0: 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73  .  But this does
68d0: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57   not work on VxW
68e0: 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f  orks..** On VxWo
68f0: 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69  rks, a unique fi
6900: 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61  le id must be ba
6910: 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e  sed on the canon
6920: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a  ical filename..*
6930: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
6940: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6950: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
6960: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
6970: 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69  used as a.** uni
6980: 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56  que file ID in V
6990: 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e  xWorks.  Each in
69a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
69b0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
69c0: 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74  s.** a copy of t
69d0: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
69e0: 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73  ename.  There is
69f0: 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63   also a referenc
6a00: 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68  e count.  .** Th
6a10: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  e structure is r
6a20: 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68  eclaimed when th
6a30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  e number of poin
6a40: 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73  ters to it drops
6a50: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a   to.** zero..**.
6a60: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76  ** There are nev
6a70: 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c  er very many fil
6a80: 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74  es open at one t
6a90: 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20  ime and lookups 
6aa0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72  are not.** a per
6ab0: 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61  formance-critica
6ac0: 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73  l path, so it is
6ad0: 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
6ae0: 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75  ut these.** stru
6af0: 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b  ctures on a link
6b00: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75  ed list..*/.stru
6b10: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6b20: 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f   {.  struct vxwo
6b30: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74  rksFileId *pNext
6b40: 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20  ;  /* Next in a 
6b50: 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c  list of them all
6b60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6b90: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
6ba0: 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74  his one */.  int
6bb0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
6bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6bd0: 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e  ngth of the zCan
6be0: 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72  onicalName[] str
6bf0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
6c00: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20  CanonicalName;  
6c10: 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69         /* Canoni
6c20: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  cal filename */.
6c30: 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  };..#if OS_VXWOR
6c40: 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e  KS./* .** All un
6c50: 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  ique filenames a
6c60: 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e  re held on a lin
6c70: 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20  ked list headed 
6c80: 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  by this.** varia
6c90: 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble:.*/.static s
6ca0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
6cb0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65  eId *vxworksFile
6cc0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
6cd0: 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65   Simplify a file
6ce0: 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61  name into its ca
6cf0: 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20  nonical form.** 
6d00: 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f  by making the fo
6d10: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a  llowing changes:
6d20: 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69  .**.**  * removi
6d30: 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ng any trailing 
6d40: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a  and duplicate /.
6d50: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e  **  * convert /.
6d60: 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  / into just /.**
6d70: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e    * convert /A/.
6d80: 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e  ./ where A is an
6d90: 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e  y simple name in
6da0: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20  to just /.**.** 
6db0: 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  Changes are made
6dc0: 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75   in-place.  Retu
6dd0: 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20  rn the new name 
6de0: 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  length..**.** Th
6df0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e  e original filen
6e00: 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e  ame is in z[0..n
6e10: 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  -1].  Return the
6e20: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68   number of.** ch
6e30: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
6e40: 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e  simplified name.
6e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
6e60: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
6e70: 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  me(char *z, int 
6e80: 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  n){.  int i, j;.
6e90: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
6ea0: 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e  z[n-1]=='/' ){ n
6eb0: 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  --; }.  for(i=j=
6ec0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
6ed0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20    if( z[i]=='/' 
6ee0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
6ef0: 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
6f00: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
6f10: 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b  [i+1]=='.' && i+
6f20: 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27  2<n && z[i+2]=='
6f30: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  /' ){.        i 
6f40: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 1;.        co
6f50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
6f60: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
6f70: 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26  =='.' && i+3<n &
6f80: 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26  & z[i+2]=='.' &&
6f90: 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a   z[i+3]=='/' ){.
6fa0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
6fb0: 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f  >0 && z[j-1]!='/
6fc0: 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ j--; }.    
6fd0: 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a      if( j>0 ){ j
6fe0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20  --; }.        i 
6ff0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f  += 2;.        co
7000: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
7010: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d      }.    z[j++]
7020: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a   = z[i];.  }.  z
7030: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [j] = 0;.  retur
7040: 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n j;.}../*.** Fi
7050: 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  nd a unique file
7060: 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65   ID for the give
7070: 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e  n absolute pathn
7080: 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ame.  Return.** 
7090: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
70a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
70b0: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69  bject.  This poi
70c0: 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71  nter is the uniq
70d0: 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a  ue.** file ID..*
70e0: 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69  *.** The nRef fi
70f0: 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72  eld of the vxwor
7100: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
7110: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  is incremented b
7120: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a  efore.** the obj
7130: 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ect is returned.
7140: 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46    A new vxworksF
7150: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7160: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61  created.** and a
7170: 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62  dded to the glob
7180: 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73  al list if neces
7190: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sary..**.** If a
71a0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
71b0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
71c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
71d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
71e0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
71f0: 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28  worksFindFileId(
7200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73  const char *zAbs
7210: 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74  oluteName){.  st
7220: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
7230: 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  Id *pNew;       
7240: 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20    /* search key 
7250: 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20  and new file ID 
7260: 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  */.  struct vxwo
7270: 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64  rksFileId *pCand
7280: 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20  idate;   /* For 
7290: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69  looping over exi
72a0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a  sting file IDs *
72b0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
72e0: 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61  h of zAbsoluteNa
72f0: 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  me string */..  
7300: 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74  assert( zAbsolut
7310: 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  eName[0]=='/' );
7320: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  .  n = (int)strl
7330: 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  en(zAbsoluteName
7340: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7350: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
7360: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31  of(*pNew) + (n+1
7370: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
7380: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7390: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
73a0: 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  lName = (char*)&
73b0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70  pNew[1];.  memcp
73c0: 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  y(pNew->zCanonic
73d0: 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74  alName, zAbsolut
73e0: 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e  eName, n+1);.  n
73f0: 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69   = vxworksSimpli
7400: 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61  fyName(pNew->zCa
7410: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b  nonicalName, n);
7420: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
7430: 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  r an existing en
7440: 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e  try that matchin
7450: 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  g the canonical 
7460: 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f  name..  ** If fo
7470: 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74  und, increment t
7480: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7490: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  nt and return a 
74a0: 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20  pointer to.  ** 
74b0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c  the existing fil
74c0: 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  e ID..  */.  uni
74d0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
74e0: 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d   for(pCandidate=
74f0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
7500: 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61   pCandidate; pCa
7510: 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61  ndidate=pCandida
7520: 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  te->pNext){.    
7530: 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e  if( pCandidate->
7540: 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26  nName==n .     &
7550: 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64  & memcmp(pCandid
7560: 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  ate->zCanonicalN
7570: 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  ame, pNew->zCano
7580: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30  nicalName, n)==0
7590: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
75a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
75b0: 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69  );.       pCandi
75c0: 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  date->nRef++;.  
75d0: 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
75e0: 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65  tex();.       re
75f0: 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b  turn pCandidate;
7600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7610: 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f   No match was fo
7620: 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61  und.  We will ma
7630: 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44  ke a new file ID
7640: 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66   */.  pNew->nRef
7650: 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e   = 1;.  pNew->nN
7660: 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d  ame = n;.  pNew-
7670: 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73  >pNext = vxworks
7680: 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f  FileList;.  vxwo
7690: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e  rksFileList = pN
76a0: 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ew;.  unixLeaveM
76b0: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
76c0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
76d0: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
76e0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
76f0: 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64   a vxworksFileId
7700: 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a   object.  Free.*
7710: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65  * the object whe
7720: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
7730: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
7740: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ro..*/.static vo
7750: 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  id vxworksReleas
7760: 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76  eFileId(struct v
7770: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
7780: 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  d){.  unixEnterM
7790: 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
77a0: 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pId->nRef>0 );
77b0: 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pId->nRef--;.
77c0: 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d    if( pId->nRef=
77d0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
77e0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
77f0: 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d  *pp;.    for(pp=
7800: 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  &vxworksFileList
7810: 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49  ; *pp && *pp!=pI
7820: 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d  d; pp = &((*pp)-
7830: 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61  >pNext)){}.    a
7840: 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20  ssert( *pp==pId 
7850: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64  );.    *pp = pId
7860: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
7870: 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a  ite3_free(pId);.
7880: 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
7890: 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66  utex();.}.#endif
78a0: 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
78b0: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
78c0: 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65  ** End of Unique
78d0: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
78e0: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
78f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
7900: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
7910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7950: 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
7960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79a0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
79c0: 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
79d0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
79e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
79f0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20  ***.**.** POSIX 
7a00: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
7a10: 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73  re broken by des
7a20: 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31  ign.  ANSI STD 1
7a30: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
7a40: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
7a50: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
7a60: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
7a70: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
7a80: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
7a90: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
7aa0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
7ab0: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
7ac0: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
7ad0: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
7ae0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
7af0: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
7b00: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
7b10: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
7b20: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
7b30: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
7b40: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
7b50: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
7b60: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
7b70: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
7b80: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
7b90: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
7ba0: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
7bb0: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
7bc0: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
7bd0: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
7be0: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
7bf0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
7c00: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
7c10: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
7c20: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
7c30: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
7c40: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
7c50: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
7c60: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
7c70: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
7c80: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
7c90: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
7ca0: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
7cb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
7cc0: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
7cd0: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
7ce0: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
7cf0: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
7d00: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
7d10: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
7d20: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
7d30: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
7d40: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
7d50: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
7d60: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
7d70: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
7d80: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
7d90: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
7da0: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
7db0: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
7dc0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
7dd0: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
7de0: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
7df0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  es..**.** This m
7e00: 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e  eans that we can
7e10: 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f  not use POSIX lo
7e20: 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  cks to synchroni
7e30: 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a  ze file access.*
7e40: 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e  * among competin
7e50: 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65  g threads of the
7e60: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
7e70: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c  POSIX locks will
7e80: 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f   work fine.** to
7e90: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63   synchronize acc
7ea0: 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20  ess for threads 
7eb0: 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  in separate proc
7ec0: 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a  esses, but not.*
7ed0: 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e  * threads within
7ee0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
7ef0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  s..**.** To work
7f00: 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62   around the prob
7f10: 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20  lem, SQLite has 
7f20: 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c  to manage file l
7f30: 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  ocks internally.
7f40: 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20  ** on its own.  
7f50: 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64  Whenever a new d
7f60: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
7f70: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69  d, we have to fi
7f80: 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  nd the.** specif
7f90: 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20  ic inode of the 
7fa0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74  database file (t
7fb0: 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65  he inode is dete
7fc0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  rmined by the.**
7fd0: 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69   st_dev and st_i
7fe0: 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  no fields of the
7ff0: 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20   stat structure 
8000: 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c  that fstat() fil
8010: 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68  ls in).** and ch
8020: 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c  eck for locks al
8030: 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f  ready existing o
8040: 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57  n that inode.  W
8050: 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  hen locks are.**
8060: 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f   created or remo
8070: 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20  ved, we have to 
8080: 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20  look at our own 
8090: 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
80a0: 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20  of the.** locks 
80b0: 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
80c0: 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65  r thread has pre
80d0: 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f  viously set a lo
80e0: 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a  ck on that same.
80f0: 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ** inode..**.** 
8100: 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20  (Aside: The use 
8110: 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73  of inode numbers
8120: 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64   as unique IDs d
8130: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
8140: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20  VxWorks..** For 
8150: 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65  VxWorks, we have
8160: 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65   to use the alte
8170: 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49  rnative unique I
8180: 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f  D system based o
8190: 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66  n.** canonical f
81a0: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c  ilename and impl
81b0: 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70  emented in the p
81c0: 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e  revious division
81d0: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  .).**.** The sql
81e0: 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74  ite3_file struct
81f0: 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73  ure for POSIX is
8200: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20   no longer just 
8210: 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  an integer file.
8220: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  ** descriptor.  
8230: 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75  It is now a stru
8240: 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73  cture that holds
8250: 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c   the integer fil
8260: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
8270: 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
8280: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
8290: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
82a0: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b  internal.** lock
82b0: 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  s on the corresp
82c0: 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54  onding inode.  T
82d0: 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b  here is one lock
82e0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  ing structure.**
82f0: 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69   per inode, so i
8300: 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  f the same inode
8310: 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65   is opened twice
8320: 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20  , both unixFile 
8330: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f  structures.** po
8340: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
8350: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
8360: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  e.  The locking 
8370: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a  structure keeps.
8380: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  ** a reference c
8390: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c  ount (so we will
83a0: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65   know when to de
83b0: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22  lete it) and a "
83c0: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68  cnt".** field th
83d0: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20  at tells us its 
83e0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
83f0: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65  atus.  cnt==0 me
8400: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ans the.** file 
8410: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e  is unlocked.  cn
8420: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20  t==-1 means the 
8430: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c  file has an excl
8440: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63  usive lock..** c
8450: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>0 means there
8460: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20   are cnt shared 
8470: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c  locks on the fil
8480: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74  e..**.** Any att
8490: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  empt to lock or 
84a0: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69  unlock a file fi
84b0: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  rst checks the l
84c0: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  ocking.** struct
84d0: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28  ure.  The fcntl(
84e0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73  ) system call is
84f0: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f   only invoked to
8500: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58   set a .** POSIX
8510: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74   lock if the int
8520: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63  ernal lock struc
8530: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  ture transitions
8540: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f   between.** a lo
8550: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f  cked and an unlo
8560: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  cked state..**.*
8570: 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65  * But wait:  the
8580: 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20  re are yet more 
8590: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f  problems with PO
85a0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
85b0: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75  ks..**.** If you
85c0: 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65   close a file de
85d0: 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f  scriptor that po
85e0: 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74  ints to a file t
85f0: 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a  hat has locks,.*
8600: 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74  * all locks on t
8610: 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72  hat file that ar
8620: 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63  e owned by the c
8630: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61  urrent process a
8640: 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20  re.** released. 
8650: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
8660: 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61  this problem, ea
8670: 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ch unixInodeInfo
8680: 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74   object.** maint
8690: 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  ains a count of 
86a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65  the number of pe
86b0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74  nding locks on t
86c0: 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65  ha inode..** Whe
86d0: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
86e0: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
86f0: 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68   unixFile, if th
8700: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
8710: 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f   unixFile open o
8720: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
8730: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
8740: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
8750: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
8760: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
8770: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
8780: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
8790: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
87a0: 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   The unixInodeIn
87b0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  fo structure kee
87c0: 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c  ps a list of fil
87d0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68  e descriptors th
87e0: 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65  at need to.** be
87f0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74   closed and that
8800: 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20   list is walked 
8810: 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68  (and cleared) wh
8820: 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
8830: 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a  .** clears..**.*
8840: 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72  * Yet another pr
8850: 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72  oblem:  LinuxThr
8860: 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79  eads do not play
8870: 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78   well with posix
8880: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61   locks..**.** Ma
8890: 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  ny older version
88a0: 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74  s of linux use t
88b0: 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  he LinuxThreads 
88c0: 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73  library which is
88d0: 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f  .** not posix co
88e0: 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20  mpliant.  Under 
88f0: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20  LinuxThreads, a 
8900: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
8910: 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e  thread.** A cann
8920: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f  ot be modified o
8930: 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  r overridden by 
8940: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
8950: 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ad B..** Only th
8960: 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66  read A can modif
8970: 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63  y the lock.  Loc
8980: 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73  king behavior is
8990: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74   correct.** if t
89a0: 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73  he appliation us
89b0: 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74  es the newer Nat
89c0: 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64  ive Posix Thread
89d0: 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a   Library (NPTL).
89e0: 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69  ** on linux - wi
89f0: 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63  th NPTL a lock c
8a00: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
8a10: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
8a20: 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65  locks.** in thre
8a30: 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65  ad B.  But there
8a40: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
8a50: 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ow at compile-ti
8a60: 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65  me which.** thre
8a70: 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73  ading library is
8a80: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f   being used.  So
8a90: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
8aa0: 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63   to know at.** c
8ab0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74  ompile-time whet
8ac0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
8ad0: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
8ae0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64   locks on thread
8af0: 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74   B..** One has t
8b00: 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20  o do a run-time 
8b10: 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65  check to discove
8b20: 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  r the behavior o
8b30: 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
8b40: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
8b50: 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73  SQLite used to s
8b60: 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65  upport LinuxThre
8b70: 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72  ads.  But suppor
8b80: 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61  t for LinuxThrea
8b90: 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65  ds.** was droppe
8ba0: 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  d beginning with
8bb0: 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20   version 3.7.0. 
8bc0: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69   SQLite will sti
8bd0: 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  ll work with.** 
8be0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f  LinuxThreads pro
8bf0: 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74  vided that (1) t
8c00: 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20  here is no more 
8c10: 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74  than one connect
8c20: 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61  ion .** per data
8c30: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
8c40: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e   same process an
8c50: 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63  d (2) database c
8c60: 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f  onnections.** do
8c70: 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73   not move across
8c80: 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a   threads..*/../*
8c90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
8ca0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
8cb0: 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65   structure serve
8cc0: 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65  s as the key use
8cd0: 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61  d.** to locate a
8ce0: 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78   particular unix
8cf0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8d00: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8d10: 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74  FileId {.  dev_t
8d20: 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   dev;           
8d30: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
8d40: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f   number */.#if O
8d50: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
8d60: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
8d70: 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75   *pId;  /* Uniqu
8d80: 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78  e file ID for vx
8d90: 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a  works. */.#else.
8da0: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8dc0: 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f   Inode number */
8dd0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8de0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
8df0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
8e00: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
8e10: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
8e20: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f  pen.** inode.  O
8e30: 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61  r, on LinuxThrea
8e40: 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65  ds, there is one
8e50: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
8e60: 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68  ures for.** each
8e70: 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79   inode opened by
8e80: 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a   each thread..**
8e90: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
8ea0: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
8eb0: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
8ec0: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75  ptors, so each u
8ed0: 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
8ee0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ture contains a 
8ef0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
8f00: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
8f10: 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a  bject and this.*
8f20: 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61  * object keeps a
8f30: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
8f40: 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65  mber of unixFile
8f50: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
8f60: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49  .*/.struct unixI
8f70: 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72  nodeInfo {.  str
8f80: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66  uct unixFileId f
8f90: 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20  ileId;       /* 
8fa0: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
8fb0: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8fe0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65   SHARED locks he
8ff0: 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ld */.  unsigned
9000: 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b   char eFileLock;
9010: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
9020: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
9030: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
9040: 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  . */.  unsigned 
9050: 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63  char bProcessLoc
9060: 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63  k;     /* An exc
9070: 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c  lusive process l
9080: 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  ock is held */. 
9090: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f   /* Number of po
90c0: 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73  inters to this s
90d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e  tructure */.  un
90e0: 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
90f0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
9100: 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   Shared memory a
9110: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9120: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
9130: 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt nLock;       
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9150: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
9160: 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63  tanding file loc
9170: 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  ks */.  UnixUnus
9180: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
9190: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
91a0: 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
91b0: 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  rs to close */. 
91c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
91d0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
91e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
91f0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9200: 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49  jects */.  unixI
9210: 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b  nodeInfo *pPrev;
9220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
9230: 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e   .... doubly lin
9240: 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ked */.#if SQLIT
9250: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
9260: 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65  _STYLE.  unsigne
9270: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
9280: 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20  edByte;  /* for 
9290: 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68  AFP simulated sh
92a0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  ared lock */.#en
92b0: 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  dif.#if OS_VXWOR
92c0: 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  KS.  sem_t *pSem
92d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f       /* Named PO
92f0: 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  SIX semaphore */
9300: 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65  .  char aSemName
9310: 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d  [MAX_PATHNAME+2]
9320: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
9330: 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  at semaphore */.
9340: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
9350: 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20   A lists of all 
9360: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
9370: 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
9380: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
9390: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  inodeList = 0;..
93a0: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
93b0: 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67  nction - unixLog
93c0: 45 72 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e  Error_x(), is on
93d0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
93e0: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
93f0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a  unixLogError()..
9400: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
9410: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
9420: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
9430: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  OS function and 
9440: 65 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a  errno has been.*
9450: 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61  * set. It logs a
9460: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
9470: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
9480: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
9490: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
94a0: 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f  errno and, if po
94b0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
94c0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
94d0: 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72  alent from strer
94e0: 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65  ror() or.** stre
94f0: 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  rror_r()..**.** 
9500: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
9510: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
9520: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
9530: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9540: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
9550: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
9560: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
9570: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
9580: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
9590: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
95a0: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
95b0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
95c0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
95d0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
95e0: 61 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c  ailed (e.g. "unl
95f0: 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e  ink", "open") an
9600: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
9610: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
9620: 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f  h,.** if any..*/
9630: 0a 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67  .#define unixLog
9640: 45 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20  Error(a,b,c)    
9650: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9660: 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45  ine(a,b,c,__LINE
9670: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __).static int u
9680: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
9690: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
96a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
96b0: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
96c0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
96d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
96e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
96f0: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
9700: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
9710: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
9720: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
9730: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
9740: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
9750: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
9760: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9780: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
9790: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
97a0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
97b0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20    char *zErr;   
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f    /* Message fro
97e0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20  m strerror() or 
97f0: 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20  equivalent */.  
9800: 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72  int iErrno = err
9810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9820: 2f 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c  /* Saved syscall
9830: 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f   error number */
9840: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
9850: 73 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61  s not a threadsa
9860: 66 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45  fe build (SQLITE
9870: 5f 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c  _THREADSAFE==0),
9880: 20 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74   then use.  ** t
9890: 68 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75  he strerror() fu
98a0: 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  nction to obtain
98b0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
98c0: 62 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ble error messag
98d0: 65 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e  e.  ** equivalen
98e0: 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65  t to errno. Othe
98f0: 72 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72  rwise, use strer
9900: 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23  ror_r()..  */ .#
9910: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
9920: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
9930: 48 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29  HAVE_STRERROR_R)
9940: 0a 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d  .  char aErr[80]
9950: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c  ;.  memset(aErr,
9960: 20 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29   0, sizeof(aErr)
9970: 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72  );.  zErr = aErr
9980: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52  ;..  /* If STRER
9990: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65  ROR_R_CHAR_P (se
99a0: 74 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63  t by autoconf sc
99b0: 72 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f  ripts) or __USE_
99c0: 47 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a  GNU is defined,.
99d0: 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
99e0: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
99f0: 69 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72  ides the GNU ver
9a00: 73 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72  sion of strerror
9a10: 5f 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72  _r() that.  ** r
9a20: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
9a30: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
9a40: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f  taining the erro
9a50: 72 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20  r message. That 
9a60: 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61  pointer .  ** ma
9a70: 79 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b  y point to aErr[
9a80: 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69  ], or it may poi
9a90: 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69  nt to some stati
9aa0: 63 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68  c storage somewh
9ab0: 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ere. .  ** Other
9ac0: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  wise, assume tha
9ad0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f  t the system pro
9ae0: 76 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20  vides the POSIX 
9af0: 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a  version of .  **
9b00: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77   strerror_r(), w
9b10: 68 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74  hich always writ
9b20: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9b30: 61 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e  age into aErr[].
9b40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
9b50: 65 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74  e code incorrect
9b60: 6c 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ly assumes that 
9b70: 69 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20  it is the POSIX 
9b80: 76 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a  version that is.
9b90: 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20    ** available, 
9ba0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9bb0: 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20  e will often be 
9bc0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
9bd0: 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65   Not a.  ** huge
9be0: 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72   problem. Incorr
9bf0: 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67  ectly concluding
9c00: 20 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65   that the GNU ve
9c10: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
9c20: 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c  le .  ** could l
9c30: 65 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c  ead to a segfaul
9c40: 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23  t though..  */.#
9c50: 69 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52  if defined(STRER
9c60: 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c  ROR_R_CHAR_P) ||
9c70: 20 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47   defined(__USE_G
9c80: 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20  NU).  zErr = .# 
9c90: 65 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72  endif.  strerror
9ca0: 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c  _r(iErrno, aErr,
9cb0: 20 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29   sizeof(aErr)-1)
9cc0: 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  ;..#elif SQLITE_
9cd0: 54 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20  THREADSAFE.  /* 
9ce0: 54 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64  This is a thread
9cf0: 73 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20  safe build, but 
9d00: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20  strerror_r() is 
9d10: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a  not available. *
9d20: 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23  /.  zErr = "";.#
9d30: 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68  else.  /* Non-th
9d40: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
9d50: 75 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20  use strerror(). 
9d60: 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65  */.  zErr = stre
9d70: 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65  rror(iErrno);.#e
9d80: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
9d90: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
9da0: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
9db0: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
9dc0: 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ";.  sqlite3_log
9dd0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
9de0: 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28  "os_unix.c:%d: (
9df0: 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  %d) %s(%s) - %s"
9e00: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69  ,.      iLine, i
9e10: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
9e20: 61 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a  ath, zErr.  );..
9e30: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
9e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
9e50: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
9e60: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  or..**.** We ass
9e70: 75 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29  ume that close()
9e80: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77   almost always w
9e90: 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69  orks, since it i
9ea0: 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76  s only in a.** v
9eb0: 65 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61  ery sick applica
9ec0: 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72  tion or on a ver
9ed0: 79 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20  y sick platform 
9ee0: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61  that it might fa
9ef0: 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  il..** If it doe
9f00: 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c  s fail, simply l
9f10: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
9f20: 63 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20  criptor, but do 
9f30: 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  log the.** error
9f40: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
9f50: 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  t it is not safe
9f60: 20 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28   to retry close(
9f70: 29 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69  ) after EINTR si
9f80: 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nce the.** file 
9f90: 64 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74  descriptor might
9fa0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
9fb0: 65 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f  en reused by ano
9fc0: 74 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20  ther thread..** 
9fd0: 53 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e  So we don't even
9fe0: 20 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20   try to recover 
9ff0: 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20  from an EINTR.  
a000: 4a 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72  Just log the err
a010: 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f  or.** and move o
a020: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
a030: 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75  d robust_close(u
a040: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
a050: 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e  int h, int linen
a060: 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73  o){.  if( osClos
a070: 65 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78  e(h) ){.    unix
a080: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53  LogErrorAtLine(S
a090: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
a0a0: 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20  E, "close",.    
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65     pFile ? pFile
a0d0: 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e  ->zPath : 0, lin
a0e0: 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  eno);.  }.}../*.
a0f0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  ** Close all fil
a100: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63  e descriptors ac
a110: 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20  cumuated in the 
a120: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70  unixInodeInfo->p
a130: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20  Unused list..*/ 
a140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
a150: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69  sePendingFds(uni
a160: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
a170: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a180: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
a190: 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
a1a0: 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69  usedFd *p;.  Uni
a1b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
a1c0: 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65  ;.  for(p=pInode
a1d0: 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d  ->pUnused; p; p=
a1e0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
a1f0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
a200: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
a210: 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c  File, p->fd, __L
a220: 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69  INE__);.    sqli
a230: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
a240: 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
a250: 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
a260: 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49   Release a unixI
a270: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
a280: 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  re previously al
a290: 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 49  located by findI
a2a0: 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a  nodeInfo()..**.*
a2b0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
a2c0: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
a2d0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
a2e0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
a2f0: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
a300: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a310: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
a320: 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64  void releaseInod
a330: 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a  eInfo(unixFile *
a340: 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e  pFile){.  unixIn
a350: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
a360: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
a370: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
a380: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
a390: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64  if( ALWAYS(pInod
a3a0: 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  e) ){.    pInode
a3b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
a3c0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  ( pInode->nRef==
a3d0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
a3e0: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  t( pInode->pShmN
a3f0: 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ode==0 );.      
a400: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
a410: 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
a420: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20  ( pInode->pPrev 
a430: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a440: 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76  t( pInode->pPrev
a450: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20  ->pNext==pInode 
a460: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  );.        pInod
a470: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  e->pPrev->pNext 
a480: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
a490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a4a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e        assert( in
a4b0: 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20  odeList==pInode 
a4c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65  );.        inode
a4d0: 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  List = pInode->p
a4e0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
a4f0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
a500: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
a510: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
a520: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
a530: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
a540: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
a550: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e  pPrev = pInode->
a560: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20  pPrev;.      }. 
a570: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
a580: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d  e(pInode);.    }
a590: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
a5a0: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
a5b0: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68  iptor, locate th
a5c0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
a5d0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64  object that.** d
a5e0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
a5f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
a600: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
a610: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
a620: 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
a630: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69  lue might be uni
a640: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
a650: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
a660: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
a670: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
a680: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
a690: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
a6a0: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
a6b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
a6c0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
a6d0: 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72  eturn an appropr
a6e0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
a6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a700: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20  indInodeInfo(.  
a710: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a730: 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68  * Unix file with
a740: 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20   file desc used 
a750: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
a760: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a  unixInodeInfo **
a770: 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f  ppInode        /
a780: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
a790: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a7a0: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
a7b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74   System call ret
a7e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
a7f0: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a810: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
a820: 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f  tor for pFile */
a830: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
a840: 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20  leId fileId;    
a850: 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20    /* Lookup key 
a860: 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  for the unixInod
a870: 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63  eInfo */.  struc
a880: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
a890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
a8a0: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
a8b0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69  rmation */.  uni
a8c0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
a8d0: 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43  de = 0;     /* C
a8e0: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f  andidate unixIno
a8f0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  deInfo object */
a900: 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ..  assert( unix
a910: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a  MutexHeld() );..
a920: 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76    /* Get low-lev
a930: 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  el information a
a940: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 68  bout the file th
a950: 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20 74  at we can used t
a960: 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  o.  ** create a 
a970: 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20  unique name for 
a980: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
a990: 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a   fd = pFile->h;.
a9a0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
a9b0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
a9c0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
a9d0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a9e0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64 65  o = errno;.#ifde
a9f0: 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20  f EOVERFLOW.    
aa00: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
aa10: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
aa20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
aa30: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
aa40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aa50: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
aa60: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
aa70: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
aa80: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
aa90: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
aaa0: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
aab0: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
aac0: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
aad0: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
aae0: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
aaf0: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
ab00: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
ab10: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
ab20: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
ab30: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
ab40: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
ab50: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
ab60: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
ab70: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
ab80: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
ab90: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
aba0: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
abb0: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
abc0: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
abd0: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
abe0: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
abf0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
ac00: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
ac10: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
ac20: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
ac30: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
ac40: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
ac50: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
ac60: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
ac70: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
ac80: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
ac90: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
aca0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
acb0: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
acc0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
acd0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
ace0: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
acf0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
ad00: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
ad10: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
ad20: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
ad30: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
ad40: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
ad50: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
ad60: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  rc!=1 ){.      p
ad70: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
ad80: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
ad90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
ada0: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
adb0: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
adc0: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
add0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
ade0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
adf0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ae00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
ae10: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
ae20: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
ae30: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
ae40: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
ae50: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
ae60: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
ae70: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
ae80: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
ae90: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
aea0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
aeb0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
aec0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
aed0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
aee0: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
aef0: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
af00: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
af10: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
af20: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
af30: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
af40: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
af50: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
af60: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
af70: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
af80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
af90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
afa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
afb0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
afc0: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
afd0: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
afe0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
aff0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
b000: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
b010: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
b020: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
b030: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
b040: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
b050: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
b060: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
b070: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
b080: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
b090: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
b0a0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
b0b0: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
b0c0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
b0d0: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
b0e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0f0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
b100: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
b110: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
b120: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
b130: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
b140: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
b150: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
b160: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
b170: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
b180: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
b190: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
b1a0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
b1b0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
b1c0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
b1d0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
b1e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
b1f0: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
b200: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
b210: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
b220: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
b230: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
b240: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
b250: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
b260: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
b270: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b280: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
b290: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
b2a0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
b2b0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
b2c0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
b2d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
b2e0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
b2f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
b300: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
b310: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
b320: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
b330: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
b340: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
b350: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
b360: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
b370: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
b380: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
b390: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
b3a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
b3b0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
b3c0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
b3d0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
b3e0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
b3f0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
b400: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
b410: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
b420: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
b430: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
b440: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
b450: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
b460: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
b470: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
b480: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
b490: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
b4a0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
b4b0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
b4c0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
b4d0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
b4e0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
b4f0: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
b500: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
b510: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b520: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20  ESERVEDLOCK;.   
b530: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
b540: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
b550: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
b560: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
b570: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
b580: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
b590: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
b5a0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
b5b0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
b5c0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
b5d0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
b5e0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
b5f0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
b600: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
b610: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b620: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
b630: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
b640: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
b650: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
b660: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
b670: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
b680: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
b690: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
b6a0: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
b6b0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
b6c0: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
b6d0: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
b6e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
b6f0: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
b700: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
b710: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
b720: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
b730: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
b740: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
b750: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
b760: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
b770: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
b780: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
b790: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
b7a0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
b7b0: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
b7c0: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
b7d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
b7e0: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
b7f0: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
b800: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
b810: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
b820: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
b830: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
b840: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
b850: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
b860: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
b870: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
b880: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
b890: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
b8a0: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
b8b0: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
b8c0: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
b8d0: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
b8e0: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
b8f0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
b900: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
b910: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
b920: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
b930: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
b940: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
b950: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
b960: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
b970: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
b980: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
b990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b9a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
b9b0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
b9c0: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
b9d0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
b9e0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
b9f0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ba00: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
ba10: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
ba20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
ba30: 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  node!=0 );.  if(
ba40: 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c   ((pFile->ctrlFl
ba50: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45  ags & UNIXFILE_E
ba60: 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64  XCL)!=0 || pInod
ba70: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29  e->bProcessLock)
ba80: 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  .   && ((pFile->
ba90: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
baa0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29  FILE_RDONLY)==0)
bab0: 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  .  ){.    if( pI
bac0: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
bad0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ck==0 ){.      s
bae0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
baf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bb00: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
bb10: 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   );.      lock.l
bb20: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
bb30: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
bb40: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
bb50: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
bb60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
bb70: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _SIZE;.      loc
bb80: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
bb90: 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f  CK;.      rc = o
bba0: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
bbb0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bbc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
bbd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
bbe0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f      pInode->bPro
bbf0: 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  cessLock = 1;.  
bc00: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
bc10: 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  k++;.    }else{.
bc20: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
bc30: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
bc40: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
bc50: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
bc60: 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72   pLock);.  }.  r
bc70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bc80: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
bc90: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
bca0: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
bcb0: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
bcc0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
bcd0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
bce0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
bcf0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
bd00: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
bd10: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
bd20: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
bd30: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
bd40: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
bd50: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
bd60: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
bd70: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
bd80: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
bd90: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
bda0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
bdb0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
bdc0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
bdd0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
bde0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
bdf0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
be00: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
be10: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
be20: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
be30: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
be40: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
be50: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
be60: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
be70: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
be80: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
be90: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
bea0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
beb0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
bec0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
bed0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
bee0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
bef0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
bf00: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
bf10: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
bf20: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
bf30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
bf40: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
bf50: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
bf60: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
bf70: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
bf80: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
bf90: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
bfa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bfb0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
bfc0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
bfd0: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
bfe0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
bff0: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
c000: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
c010: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
c020: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
c030: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
c040: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
c050: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
c060: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
c070: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
c080: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
c090: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
c0a0: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
c0b0: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
c0c0: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
c0d0: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
c0e0: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
c0f0: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
c100: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
c110: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
c120: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
c130: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
c140: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
c150: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
c160: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
c170: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
c180: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
c190: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
c1a0: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
c1b0: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
c1c0: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
c1d0: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
c1e0: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
c1f0: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
c200: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
c210: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
c220: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
c230: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
c240: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
c250: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
c260: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
c270: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
c280: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
c290: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
c2a0: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
c2b0: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
c2c0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
c2d0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
c2e0: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
c2f0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
c300: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
c310: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
c320: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
c330: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
c340: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
c350: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
c360: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
c370: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
c380: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
c390: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
c3a0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
c3b0: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
c3c0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
c3d0: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
c3e0: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
c3f0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
c400: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
c410: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
c420: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
c430: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
c440: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
c450: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c460: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
c470: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
c480: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
c490: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
c4a0: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
c4b0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
c4c0: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
c4d0: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
c4e0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
c4f0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
c500: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
c510: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
c520: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
c530: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
c540: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
c550: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
c560: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
c570: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
c580: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
c590: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
c5a0: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
c5b0: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
c5c0: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
c5d0: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
c5e0: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
c5f0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
c600: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
c610: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
c620: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
c630: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
c640: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
c650: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
c660: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
c670: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
c680: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
c690: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
c6a0: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
c6b0: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
c6c0: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
c6d0: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
c6e0: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
c6f0: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
c700: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
c710: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
c720: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
c730: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
c740: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
c750: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
c760: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
c770: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
c780: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
c790: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c7a0: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
c7b0: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
c7c0: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
c7d0: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
c7e0: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
c7f0: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
c800: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
c810: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c820: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
c830: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c840: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
c850: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
c860: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
c870: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
c880: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
c890: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
c8a0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
c8b0: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
c8c0: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
c8d0: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
c8e0: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
c8f0: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
c900: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
c910: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
c920: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
c930: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
c940: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c  eFileLock), pFil
c950: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
c960: 65 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ed , getpid()));
c970: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c980: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
c990: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
c9a0: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
c9b0: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
c9c0: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
c9d0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
c9e0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
c9f0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
ca00: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
ca10: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
ca20: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
ca30: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
ca40: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
ca50: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
ca60: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
ca70: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
ca80: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
ca90: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
caa0: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
cab0: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
cac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cad0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
cae0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
caf0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
cb00: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
cb10: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
cb20: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
cb30: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
cb40: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
cb50: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
cb60: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
cb70: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
cb80: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
cb90: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
cba0: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
cbb0: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
cbc0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
cbd0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
cbe0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
cbf0: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
cc00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
cc10: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
cc20: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
cc30: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
cc40: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
cc50: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
cc60: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
cc70: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
cc80: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
cc90: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
cca0: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
ccb0: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
ccc0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
ccd0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
cce0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
ccf0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
cd00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
cd10: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
cd20: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
cd30: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
cd40: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
cd50: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
cd60: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
cd70: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
cd80: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
cd90: 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
cda0: 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
cdb0: 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
cdc0: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
cdd0: 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
cde0: 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
cdf0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
ce00: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
ce10: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
ce20: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
ce30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
ce40: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
ce50: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
ce60: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
ce70: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
ce80: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
ce90: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
cea0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
ceb0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
cec0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
ced0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
cee0: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
cef0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cf00: 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f   && .      (pIno
cf10: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
cf20: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
cf30: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
cf40: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
cf50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
cf60: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
cf70: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
cf80: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
cf90: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
cfa0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
cfb0: 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
cfc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
cfd0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
cfe0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
cff0: 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
d000: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d010: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d020: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e    }...  /* A PEN
d030: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
d040: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
d050: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
d060: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
d070: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
d080: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
d090: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
d0a0: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
d0b0: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
d0c0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
d0d0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
d0e0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
d0f0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69   = SEEK_SET;.  i
d100: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
d110: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
d120: 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
d130: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
d140: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
d150: 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
d160: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
d170: 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f  _type = (eFileLo
d180: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  ck==SHARED_LOCK?
d190: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
d1a0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
d1b0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
d1c0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d1d0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d1e0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d1f0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d210: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d220: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d230: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d240: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d250: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
d260: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
d270: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
d280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d290: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d2a0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
d2b0: 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
d2c0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
d2d0: 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
d2e0: 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
d2f0: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
d300: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
d310: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
d320: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
d330: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d340: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
d350: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d360: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
d370: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
d380: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
d390: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
d3a0: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
d3b0: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
d3c0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
d3d0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
d3e0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
d3f0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
d400: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
d410: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d420: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
d430: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d440: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d450: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d460: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d470: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
d480: 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OCK);.    }..   
d490: 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
d4a0: 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
d4b0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e  ock */.    lock.
d4c0: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
d4d0: 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  G_BYTE;.    lock
d4e0: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
d4f0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
d500: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _UNLCK;.    if( 
d510: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
d520: 6c 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63  le, &lock) && rc
d530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d540: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
d550: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
d560: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
d570: 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  /.      tErrno =
d580: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
d590: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
d5a0: 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a  UNLOCK; .    }..
d5b0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d5c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d5d0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
d5e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d5f0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d600: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d610: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
d620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
d630: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
d640: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
d650: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
d660: 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  +;.      pInode-
d670: 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  >nShared = 1;.  
d680: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
d690: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
d6a0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e  SIVE_LOCK && pIn
d6b0: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29  ode->nShared>1 )
d6c0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
d6d0: 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78  trying for an ex
d6e0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74  clusive lock but
d6f0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
d700: 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  in this.    ** s
d710: 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
d720: 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
d730: 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
d740: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
d750: 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
d760: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
d770: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
d780: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
d790: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
d7a0: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
d7b0: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
d7c0: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
d7d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
d7e0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
d7f0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
d800: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69  t( 0!=pFile->eFi
d810: 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f  leLock );.    lo
d820: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
d830: 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  LCK;..    assert
d840: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
d850: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46  ERVED_LOCK || eF
d860: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d870: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69  VE_LOCK );.    i
d880: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  f( eFileLock==RE
d890: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
d8a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
d8b0: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
d8c0: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
d8d0: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65  len = 1L;.    }e
d8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  lse{.      lock.
d8f0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
d900: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
d910: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
d920: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20  D_SIZE;.    }.. 
d930: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
d940: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
d950: 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
d960: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d970: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
d980: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
d990: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
d9a0: 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
d9b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d9c0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d9d0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d9e0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d9f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
da00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
da10: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
da20: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
da30: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
da40: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
da50: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
da60: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
da70: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
da80: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
da90: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
daa0: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
dab0: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
dac0: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
dad0: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
dae0: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
daf0: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
db00: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
db10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
db20: 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c    && pFile->eFil
db30: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
db40: 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f  CK.   && eFileLo
db50: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
db60: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
db70: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
db80: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
db90: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
dba0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
dbb0: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
dbc0: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
dbd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dbe0: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
dbf0: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
dc00: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
dc10: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
dc20: 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
dc30: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
dc40: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
dc50: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
dc60: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
dc70: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
dc80: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
dc90: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
dca0: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
dcb0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
dcc0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
dcd0: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
dce0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
dcf0: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
dd00: 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  ck), .      rc==
dd10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
dd20: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
dd30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
dd40: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c  *.** Add the fil
dd50: 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65  e descriptor use
dd60: 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65  d by file handle
dd70: 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f   pFile to the co
dd80: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70  rresponding.** p
dd90: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  Unused list..*/.
dda0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50  static void setP
ddb0: 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c  endingFd(unixFil
ddc0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
ddd0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
dde0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
ddf0: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
de00: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
de10: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
de20: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
de30: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
de40: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
de50: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
de60: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d  pFile->pUnused =
de70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77   0;.}../*.** Low
de80: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
de90: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
dea0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
deb0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
dec0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
ded0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
dee0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
def0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
df00: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
df10: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
df20: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
df30: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
df40: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
df50: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
df60: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
df70: 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e  p..** .** If han
df80: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20  dleNFSUnlock is 
df90: 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f  true, then on do
dfa0: 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43  wngrading an EXC
dfb0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53  LUSIVE_LOCK to S
dfc0: 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74  HARED.** the byt
dfd0: 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64  e range is divid
dfe0: 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20  ed into 2 parts 
dff0: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61  and the first pa
e000: 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74  rt is unlocked t
e010: 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20  hen.** set to a 
e020: 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  read lock, then 
e030: 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69  the other part i
e040: 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65  s simply unlocke
e050: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a  d.  This works .
e060: 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20  ** around a bug 
e070: 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64  in BSD NFS lockd
e080: 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d   (also seen on M
e090: 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61  acOSX 10.3+) tha
e0a0: 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72  t fails to .** r
e0b0: 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20  emove the write 
e0c0: 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e  lock on a region
e0d0: 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
e0e0: 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  k is set..*/.sta
e0f0: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c  tic int posixUnl
e100: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e110: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
e120: 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ock, int handleN
e130: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
e140: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e150: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e160: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
e170: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
e180: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
e190: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e1a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e1b0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
e1c0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
e1d0: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
e1e0: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
e1f0: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
e200: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
e210: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e220: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e230: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e240: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
e250: 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b       getpid()));
e260: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
e270: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
e280: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
e290: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
e2a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
e2b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e2c0: 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
e2d0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
e2e0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e2f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
e300: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
e310: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
e320: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
e330: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
e340: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
e350: 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
e360: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
e370: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e380: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
e390: 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
e3a0: 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
e3b0: 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
e3c0: 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
e3d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e3e0: 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
e3f0: 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
e400: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
e410: 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
e420: 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
e430: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
e440: 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
e450: 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
e460: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e470: 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
e480: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
e490: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
e4a0: 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
e4b0: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
e4c0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
e4d0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
e4e0: 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
e4f0: 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
e500: 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
e510: 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
e520: 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
e530: 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
e540: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
e550: 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
e560: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
e570: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
e580: 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
e590: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
e5a0: 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
e5b0: 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
e5c0: 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
e5d0: 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
e5e0: 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
e5f0: 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
e600: 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
e610: 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
e620: 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
e630: 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
e640: 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
e650: 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
e660: 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
e670: 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
e680: 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
e690: 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
e6a0: 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
e6b0: 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
e6c0: 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
e6d0: 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
e6e0: 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
e6f0: 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
e700: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
e710: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 0a 23  HARED_LOCK ){..#
e720: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50  if !defined(__AP
e730: 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54  PLE__) || !SQLIT
e740: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
e750: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f  _STYLE.      (vo
e760: 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  id)handleNFSUnlo
e770: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
e780: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
e790: 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23  k==0 );.#endif.#
e7a0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
e7b0: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
e7c0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
e7d0: 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68  TYLE.      if( h
e7e0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
e7f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
e800: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
e810: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
e820: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
e830: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ll errors */.   
e840: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
e850: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
e860: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
e870: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
e880: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
e890: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
e8a0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
e8b0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
e8c0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
e8d0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
e8e0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
e8f0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
e900: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e910: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
e920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
e930: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e940: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e950: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
e960: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
e970: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
e980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e990: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
e9a0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
e9b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e9c0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
e9d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e9e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e9f0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
ea00: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ea10: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ea20: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
ea30: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
ea40: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ea50: 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
ea60: 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
ea70: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
ea80: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
ea90: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
eaa0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
eab0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
eac0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ead0: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
eae0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
eaf0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
eb00: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
eb10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
eb20: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
eb30: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
eb40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
eb50: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
eb60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eb70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
eb80: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
eb90: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
eba0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ebb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
ebc0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
ebd0: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
ebe0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ebf0: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
ec00: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
ec10: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
ec20: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
ec30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
ec40: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ec50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ec60: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
ec70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ec80: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
ec90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
eca0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ecb0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
ecc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ecd0: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
ece0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
ecf0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
ed00: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
ed10: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
ed20: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
ed30: 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  TYLE */.      {.
ed40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
ed50: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
ed60: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
ed70: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
ed80: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
ed90: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
eda0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
edb0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
edc0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
edd0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
ede0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29  (pFile, &lock) )
edf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
ee00: 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61  n theory, the ca
ee10: 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f  ll to unixFileLo
ee20: 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ck() cannot fail
ee30: 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72   because another
ee40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
ee50: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
ee60: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
ee70: 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65   lock. If it doe
ee80: 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  s, this .       
ee90: 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20     ** indicates 
eea0: 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
eeb0: 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
eec0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b  llowing the lock
eed0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
eee0: 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68   protocol. If th
eef0: 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75  is happens, retu
ef00: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
ef10: 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e  RDLOCK. Returnin
ef20: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  g.          ** S
ef30: 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64  QLITE_BUSY would
ef40: 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70   confuse the upp
ef50: 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61  er layer (in pra
ef60: 63 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20  ctice it causes 
ef70: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
ef80: 20 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29   assert to fail)
ef90: 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20  . */ .          
efa0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
efb0: 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_RDLOCK;.      
efc0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
efd0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
efe0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
eff0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f000: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f010: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
f020: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
f030: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f040: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
f050: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
f060: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
f070: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20  ock.l_len = 2L; 
f080: 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47   assert( PENDING
f090: 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45  _BYTE+1==RESERVE
f0a0: 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66  D_BYTE );.    if
f0b0: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f0c0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
f0d0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
f0e0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
f0f0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
f100: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f120: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
f130: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
f140: 72 6e 6f 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rno;.      goto 
f150: 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
f160: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c  }.  }.  if( eFil
f170: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
f180: 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  {.    /* Decreme
f190: 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
f1a0: 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
f1b0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
f1c0: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
f1d0: 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
f1e0: 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
f1f0: 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
f200: 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
f210: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
f220: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
f230: 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20  e->nShared--;.  
f240: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53    if( pInode->nS
f250: 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  hared==0 ){.    
f260: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f270: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
f280: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
f290: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
f2a0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
f2b0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
f2c0: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
f2d0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
f2e0: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
f2f0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f300: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f310: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f320: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f330: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
f340: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f350: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
f360: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f370: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f380: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
f390: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f3a0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f3b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f3c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
f3d0: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
f3e0: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
f3f0: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
f400: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
f410: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
f420: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
f430: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
f440: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
f450: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
f460: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
f470: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
f480: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
f490: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
f4a0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
f4b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
f4c0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
f4d0: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
f4e0: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
f4f0: 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
f500: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
f510: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
f520: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
f530: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f540: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
f550: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f560: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
f570: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
f580: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
f590: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
f5a0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
f5b0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
f5c0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
f5d0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
f5e0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
f5f0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
f600: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
f610: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
f620: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
f630: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
f640: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f650: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f660: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
f670: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f680: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
f690: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 46  k){.  assert( eF
f6a0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
f6b0: 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69  LOCK || ((unixFi
f6c0: 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68  le *)id)->nFetch
f6d0: 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  Out==0 );.  retu
f6e0: 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
f6f0: 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
f700: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
f710: 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
f720: 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
f730: 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  Byte);.static vo
f740: 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
f750: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b  (unixFile *pFd);
f760: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f770: 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
f780: 68 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  he parts of the 
f790: 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65  "close file" ope
f7a0: 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f  ration .** commo
f7b0: 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
f7c0: 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f   schemes. It clo
f7d0: 73 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ses the director
f7e0: 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61  y and file.** ha
f7f0: 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61  ndles, if they a
f800: 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65  re valid, and se
f810: 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  ts all fields of
f820: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a   the unixFile.**
f830: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e   structure to 0.
f840: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f  .**.** It is *no
f850: 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  t* necessary to 
f860: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77  hold the mutex w
f870: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
f880: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65   is called,.** e
f890: 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20  ven on VxWorks. 
f8a0: 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65   A mutex will be
f8b0: 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57   acquired on VxW
f8c0: 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76  orks by the.** v
f8d0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
f8e0: 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  eId() routine..*
f8f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f  /.static int clo
f900: 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74  seUnixFile(sqlit
f910: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
f920: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f930: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f940: 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  .  unixUnmapfile
f950: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  (pFile);.  if( p
f960: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
f970: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
f980: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
f990: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
f9a0: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
f9b0: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
f9c0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
f9d0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
f9e0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
f9f0: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
fa00: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
fa10: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
fa20: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
fa30: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
fa40: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
fa50: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
fa60: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
fa70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
fa80: 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
fa90: 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
faa0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
fab0: 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
fac0: 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
fad0: 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
fae0: 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
faf0: 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
fb00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
fb20: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
fb30: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
fb40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
fb50: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
fb60: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
fb70: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fb80: 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e  xFile *)id;.  un
fb90: 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  ixUnmapfile(pFil
fba0: 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  e);.  unixUnlock
fbb0: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
fbc0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
fbd0: 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c  );..  /* unixFil
fbe0: 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61  e.pInode is alwa
fbf0: 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f  ys valid here. O
fc00: 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66  therwise, a diff
fc10: 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a  erent close.  **
fc20: 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e   routine (e.g. n
fc30: 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f  olockClose()) wo
fc40: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  uld be called in
fc50: 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  stead..  */.  as
fc60: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e  sert( pFile->pIn
fc70: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20  ode->nLock>0 || 
fc80: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
fc90: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
fca0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
fcb0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26  File->pInode) &&
fcc0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
fcd0: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
fce0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
fcf0: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
fd00: 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
fd10: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
fd20: 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
fd30: 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
fd40: 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
fd50: 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
fd60: 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
fd70: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
fd80: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
fd90: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
fda0: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
fdb0: 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20   closed .    ** 
fdc0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f  when the last lo
fdd0: 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20  ck is cleared.. 
fde0: 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e     */.    setPen
fdf0: 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
fe00: 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64   }.  releaseInod
fe10: 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
fe20: 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
fe30: 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
fe40: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
fe50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
fe60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
fe70: 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76  of the posix adv
fe80: 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65  isory lock imple
fe90: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
fea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
feb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
ff00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
ff50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f  *********** No-o
ff70: 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p Locking ******
ff80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ff90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
ffa0: 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
ffb0: 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
ffc0: 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
ffd0: 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
ffe0: 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
fff0: 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
10000 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
10010 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
10020 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
10030 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
10040 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
10050 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
10060 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
10070 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
10080 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
10090 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
100a0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
100b0 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
100c0 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
100d0 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
100e0 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
100f0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
10100 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
10110 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
10120 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
10130 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
10140 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
10150 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
10160 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
10170 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
10180 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
10190 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
101a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
101b0 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
101c0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
101d0 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
101e0 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
101f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
10200 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
10210 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
10220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
10230 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
10240 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
10250 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
10260 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
10270 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
10280 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  nt nolockCheckRe
10290 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
102a0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
102b0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
102c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
102d0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
102e0 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20  *pResOut = 0;.  
102f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10300 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
10310 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  olockLock(sqlite
10320 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10330 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
10340 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10350 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10360 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
10370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
10380 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10390 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
103a0 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
103b0 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e   NotUsed2){.  UN
103c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
103d0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
103e0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  2);.  return SQL
103f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10400 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   Close the file.
10410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
10420 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  olockClose(sqlit
10430 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
10440 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
10450 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a  xFile(id);.}../*
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
10480 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
10490 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
104a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
104b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
10500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10560 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
10570 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
10580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
105a0 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
105b0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
105c0 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
105d0 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
105e0 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
105f0 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
10600 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
10610 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
10620 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
10630 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
10640 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
10650 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
10660 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
10670 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
10680 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
10690 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
106a0 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
106b0 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
106c0 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
106d0 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
106e0 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
106f0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
10700 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
10710 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
10720 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
10730 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
10740 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
10750 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
10760 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
10770 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
10780 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
10790 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
107a0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
107b0 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
107c0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
107d0 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
107e0 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
107f0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
10800 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
10810 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
10820 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
10830 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
10840 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
10850 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
10860 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
10870 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
10880 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
10890 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
108a0 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
108b0 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
108c0 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
108d0 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
108e0 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
108f0 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
10900 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
10910 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
10920 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
10930 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
10940 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
10950 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
10960 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
10970 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
10980 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
10990 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
109a0 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
109b0 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
109c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
109d0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
109e0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
109f0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
10a00 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
10a10 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
10a20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
10a30 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
10a40 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
10a50 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
10a60 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
10a70 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
10a80 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
10a90 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
10aa0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
10ab0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
10ac0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
10ad0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
10ae0 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
10af0 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
10b00 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
10b10 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
10b20 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
10b30 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
10b40 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
10b50 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
10b60 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
10b70 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
10b80 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
10b90 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
10ba0 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
10bb0 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
10bc0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
10bd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
10be0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10bf0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
10c00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10c10 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
10c20 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
10c30 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10c40 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
10c50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10c70 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
10c80 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
10c90 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
10ca0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10cb0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
10cc0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
10cd0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
10ce0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
10cf0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
10d00 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
10d10 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
10d20 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  n or some other 
10d30 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68  connection in th
10d40 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20  e same process. 
10d50 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f     ** holds a lo
10d60 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ck on the file. 
10d70 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   No need to chec
10d80 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  k further. */.  
10d90 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
10da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
10db0 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  The lock is held
10dc0 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
10dd0 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69  the lockfile exi
10de0 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  sts */.    const
10df0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
10e00 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
10e10 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
10e20 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72  ntext;.    reser
10e30 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  ved = osAccess(z
10e40 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b  LockFile, 0)==0;
10e50 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
10e60 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
10e70 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
10e80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
10e90 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
10ea0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
10eb0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
10ec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
10ed0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
10ee0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
10ef0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
10f00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
10f10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
10f20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
10f30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
10f40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
10f50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
10f60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
10f70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
10f80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
10f90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
10fa0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
10fb0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
10fc0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
10fd0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
10fe0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
10ff0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
11000 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
11010 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11020 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11030 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11040 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
11050 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
11060 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
11070 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
11080 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
11090 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
110a0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
110b0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
110c0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
110d0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
110e0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
110f0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
11100 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
11110 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11120 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11130 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11140 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
11150 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11160 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
11170 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
11180 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11190 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
111a0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
111b0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
111c0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
111d0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
111e0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
111f0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
11200 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
11210 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11220 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11230 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11240 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
11250 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
11260 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
11270 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
11280 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11290 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
112a0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
112b0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
112c0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
112d0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
112e0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
112f0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
11300 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
11310 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11320 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11330 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11340 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
11350 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
11360 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
11370 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
11380 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
11390 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
113a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
113b0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
113c0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
113d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
113e0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
113f0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11400 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11410 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11420 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11430 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11440 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
11450 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
11460 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
11470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11480 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
11490 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
114a0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
114b0 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
114c0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
114d0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
114e0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
114f0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
11500 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
11510 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11520 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11530 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11540 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11550 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
11560 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
11570 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
11580 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
11590 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
115a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
115b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
115c0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
115d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
115e0 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d   tErrno;.      }
115f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
11600 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20  n rc;.  } .  .  
11610 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
11620 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
11630 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
11640 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
11650 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
11660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
11670 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
11680 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
11690 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
116a0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
116b0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
116c0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
116d0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
116e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
116f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
11700 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
11710 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
11720 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
11730 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
11740 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
11750 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
11760 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
11770 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11780 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
11790 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
117a0 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
117b0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
117c0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
117d0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
117e0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
117f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11800 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
11810 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
11820 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
11830 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
11840 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
11850 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
11860 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
11870 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
11880 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22  =%d (dotlock)\n"
11890 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
118a0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
118b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
118c0 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  ck, getpid()));.
118d0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
118e0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
118f0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
11900 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
11910 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11920 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
11930 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
11940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11950 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
11960 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
11970 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
11980 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
11990 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
119a0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
119b0 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
119c0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
119d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
119e0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
119f0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
11a00 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
11a10 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
11a20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11a30 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
11a40 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
11a50 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
11a60 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
11a70 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
11a80 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
11a90 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
11aa0 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
11ab0 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
11ac0 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20  =ENOTDIR ) rc = 
11ad0 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  osUnlink(zLockFi
11ae0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11af0 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
11b00 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
11b10 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45  c = 0;.    if( E
11b20 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
11b30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11b40 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11b50 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
11b60 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11b70 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  c) ){.      pFil
11b80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
11b90 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
11ba0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
11bb0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
11bc0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
11bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11be0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
11bf0 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
11c00 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
11c10 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
11c20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
11c30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11c40 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
11c50 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
11c60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11c70 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b  _OK;.  if( id ){
11c80 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
11c90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11ca0 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c 6f 63  *)id;.    dotloc
11cb0 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
11cc0 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  OCK);.    sqlite
11cd0 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f  3_free(pFile->lo
11ce0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
11cf0 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69     rc = closeUni
11d00 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
11d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
11d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d30 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74  * End of the dot
11d40 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  -file lock imple
11d50 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
11e30 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a  flock Locking **
11e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11e60 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f  *.** Use the flo
11e70 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ck() system call
11e80 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b   to do file lock
11e90 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  ing..**.** flock
11ea0 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  () locking is li
11eb0 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  ke dot-file lock
11ec0 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68 65 20  ing in that the 
11ed0 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d  various.** fine-
11ee0 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65  grain locking le
11ef0 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62  vels supported b
11f00 79 20 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c  y SQLite are col
11f10 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61  lapsed into.** a
11f20 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76   single exclusiv
11f30 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65  e lock.  In othe
11f40 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c  r words, SHARED,
11f50 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a   RESERVED, and.*
11f60 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20  * PENDING locks 
11f70 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
11f80 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49  ng as an EXCLUSI
11f90 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65  VE lock.  SQLite
11fa0 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20  .** still works 
11fb0 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73  when you do this
11fc0 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63  , but concurrenc
11fd0 79 20 69 73 20 72 65 64 75 63 65 64 20 73 69 6e  y is reduced sin
11fe0 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  ce.** only a sin
11ff0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
12000 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  be reading the d
12010 61 74 61 62 61 73 65 20 61 74 20 61 20 74 69 6d  atabase at a tim
12020 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68  e..**.** Omit th
12030 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51  is section if SQ
12040 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12050 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72  ING_STYLE is tur
12060 6e 65 64 20 6f 66 66 20 6f 72 20 69 66 0a 2a 2a  ned off or if.**
12070 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 56   compiling for V
12080 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23 69 66 20 53  XWORKS..*/.#if S
12090 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
120a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
120b0 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
120c0 20 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63   Retry flock() c
120d0 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77  alls that fail w
120e0 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66  ith EINTR.*/.#if
120f0 64 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63  def EINTR.static
12100 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63   int robust_floc
12110 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  k(int fd, int op
12120 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  ){.  int rc;.  d
12130 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64  o{ rc = flock(fd
12140 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  ,op); }while( rc
12150 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
12160 54 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  TR );.  return r
12170 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
12180 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  ine robust_flock
12190 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29  (a,b) flock(a,b)
121a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f  .#endif.     ../
121b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
121c0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
121d0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
121e0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
121f0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
12200 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
12210 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
12220 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
12230 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
12240 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
12250 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
12260 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
12270 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
12280 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
12290 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
122a0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
122b0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
122c0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
122d0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
122e0 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65  tic int flockChe
122f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
12300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12310 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
12320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12330 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
12340 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
12350 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
12360 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
12370 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12380 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
12390 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
123a0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
123b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
123c0 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  );.  .  /* Check
123d0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
123e0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
123f0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
12400 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
12410 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
12420 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
12430 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
12440 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
12450 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
12460 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
12470 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
12480 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
12490 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20   attempt to get 
124a0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
124b0 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74  int lrc = robust
124c0 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
124d0 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
124e0 4e 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72  NB);.    if( !lr
124f0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f  c ){.      /* go
12500 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
12510 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c  ck it */.      l
12520 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12530 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12540 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28  _UN);.      if (
12550 20 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20   lrc ) {.       
12560 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
12570 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  rno;.        /* 
12580 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69  unlock failed wi
12590 74 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  th an error */. 
125a0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
125b0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
125c0 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ; .        if( I
125d0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
125e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
125f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12600 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
12610 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
12620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12630 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
12640 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
12650 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73  errno;.      res
12660 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
12670 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
12680 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
12690 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20  eserved */.     
126a0 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
126b0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
126c0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
126d0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20  IOERR_LOCK); .  
126e0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
126f0 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
12700 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
12710 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
12720 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
12730 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
12740 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
12750 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12760 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
12770 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
12780 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
12790 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
127a0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
127b0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
127c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
127d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
127e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
127f0 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76  E_OK;.    reserv
12800 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed=1;.  }.#endif
12810 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
12820 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
12830 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75  ORS */.  *pResOu
12840 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
12850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12860 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
12870 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
12880 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
12890 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
128a0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
128b0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
128c0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
128d0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
128e0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
128f0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
12900 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
12910 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
12920 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
12930 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
12940 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
12950 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
12960 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
12970 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
12980 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
12990 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
129a0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
129b0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
129c0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
129d0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
129e0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
129f0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
12a00 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
12a10 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
12a20 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
12a30 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
12a40 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
12a50 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
12a60 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
12a70 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
12a80 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
12a90 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
12aa0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
12ab0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12ac0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12ad0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
12ae0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12af0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
12b00 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
12b10 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f  .**.** flock() o
12b20 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
12b30 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
12b40 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
12b50 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
12b60 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
12b70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
12b80 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
12b90 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
12ba0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
12bb0 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
12bc0 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
12bd0 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
12be0 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
12bf0 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
12c00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12c10 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
12c20 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
12c30 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
12c40 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
12c50 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
12c60 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
12c70 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c  tatic int flockL
12c80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12c90 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
12ca0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
12cb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
12cc0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12cd0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12ce0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12cf0 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20   );..  /* if we 
12d00 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
12d10 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
12d20 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
12d30 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
12d40 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
12d50 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
12d60 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12d70 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
12d80 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12d90 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
12da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12db0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
12dc0 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
12dd0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
12de0 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63   if (robust_floc
12df0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12e00 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20  _EX | LOCK_NB)) 
12e10 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
12e20 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a   = errno;.    /*
12e30 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73   didn't get, mus
12e40 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20  t be busy */.   
12e50 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12e60 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12e70 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12e80 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
12e90 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12ea0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70  R(rc) ){.      p
12eb0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12ec0 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  = tErrno;.    }.
12ed0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
12ee0 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
12ef0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
12f00 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c  n ok */.    pFil
12f10 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
12f20 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  FileLock;.  }.  
12f30 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
12f40 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63    %d %s %s (floc
12f50 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
12f60 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
12f70 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20  eLock), .       
12f80 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
12f90 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
12fa0 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ed"));.#ifdef SQ
12fb0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
12fc0 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
12fd0 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45  if( (rc & SQLITE
12fe0 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
12ff0 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72  E_IOERR ){.    r
13000 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
13010 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
13020 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
13030 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
13040 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
13050 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  .../*.** Lower t
13060 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
13070 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
13080 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
13090 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
130a0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
130b0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
130c0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
130d0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
130e0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
130f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13100 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
13110 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
13120 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
13130 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
13140 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13160 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
13170 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
13180 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
13190 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
131a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
131b0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
131c0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
131d0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
131e0 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c  as %d pid=%d (fl
131f0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
13200 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
13210 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
13220 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69  eFileLock, getpi
13230 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  d()));.  assert(
13240 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
13250 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
13260 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
13270 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
13280 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
13290 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
132a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
132b0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
132c0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
132d0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
132e0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
132f0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
13300 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
13310 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
13320 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13330 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13340 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13350 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13360 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
13370 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f  ock. */.  if( ro
13380 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
13390 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b  ->h, LOCK_UN) ){
133a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
133b0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
133c0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75  _ERRORS.    retu
133d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
133e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
133f0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
13400 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72  _ERRORS */.    r
13410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13420 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c  RR_UNLOCK;.  }el
13430 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  se{.    pFile->e
13440 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
13450 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
13460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
13470 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
13480 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
13490 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  nt flockClose(sq
134a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
134b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
134c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
134d0 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c   ){.    flockUnl
134e0 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
134f0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
13500 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13510 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13520 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
13530 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
13540 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
13550 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  XWORK */../*****
13560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
13570 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  nd of the flock 
13580 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
13590 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
135a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
135b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13660 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20  *** Begin Named 
13670 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e  Semaphore Lockin
13680 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
13690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
136a0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
136b0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
136c0 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78   supported on Vx
136d0 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d  Works..**.** Sem
136e0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
136f0 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20  s like dot-lock 
13700 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61  and flock in tha
13710 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  t it really only
13720 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43  .** supports EXC
13730 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20  LUSIVE locking. 
13740 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   Only a single p
13750 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20  rocess can read 
13760 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20  or write.** the 
13770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
13780 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
13790 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c  educes potential
137a0 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75   concurrency, bu
137b0 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c  t.** makes the l
137c0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
137d0 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a  on much easier..
137e0 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
137f0 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
13800 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
13810 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
13820 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
13830 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
13840 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
13850 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
13860 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
13870 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
13880 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
13890 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
138a0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
138b0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
138c0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
138d0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
138e0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
138f0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
13900 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
13910 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
13920 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
13930 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
13940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13950 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
13960 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
13970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
13980 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
13990 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
139a0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
139b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
139c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
139d0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
139e0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
139f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13a00 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
13a10 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
13a20 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
13a30 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
13a40 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
13a50 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
13a60 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
13a70 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
13a80 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
13a90 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
13aa0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
13ab0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
13ac0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
13ad0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
13ae0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
13af0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
13b00 73 74 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66  statBuf;..    if
13b10 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
13b20 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
13b30 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13b40 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
13b50 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
13b60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13b70 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13b80 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13b90 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
13ba0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13bb0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  );.        pFile
13bc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
13bd0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rrno;.      } el
13be0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
13bf0 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
13c00 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
13c10 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
13c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
13c30 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
13c40 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
13c50 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
13c60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13c70 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
13c80 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
13c90 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
13ca0 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
13cb0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
13cc0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
13cd0 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
13ce0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
13cf0 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
13d00 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
13d10 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
13d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
13d30 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
13d40 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
13d50 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
13d60 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
13d70 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
13d80 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
13d90 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
13da0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
13db0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
13dc0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
13dd0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
13de0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
13df0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
13e00 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
13e10 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
13e20 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
13e30 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
13e40 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
13e50 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
13e60 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
13e70 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
13e80 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
13e90 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
13ea0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
13eb0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
13ec0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
13ed0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
13ee0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
13ef0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
13f00 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
13f10 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
13f20 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
13f30 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
13f40 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
13f50 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
13f60 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
13f70 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
13f80 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
13f90 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
13fa0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13fb0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13fc0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
13fd0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
13fe0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
13ff0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
14000 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
14010 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
14020 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
14030 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
14040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
14050 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
14060 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
14070 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
14080 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
14090 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
140a0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
140b0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
140c0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
140d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
140e0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
140f0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14100 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14110 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14120 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14130 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14140 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b  atic int semLock
14150 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14160 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14170 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
14180 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14190 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b  e*)id;.  int fd;
141a0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
141b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
141c0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
141d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
141e0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
141f0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
14200 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
14210 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
14220 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
14230 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
14240 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
14250 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
14260 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
14270 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14280 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d  leLock;.    rc =
14290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
142a0 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
142b0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c  k;.  }.  .  /* l
142c0 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f  ock semaphore no
142d0 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77  w but bail out w
142e0 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b  hen already lock
142f0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d  ed. */.  if( sem
14300 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d  _trywait(pSem)==
14310 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
14320 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
14330 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  goto sem_end_loc
14340 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74  k;.  }..  /* got
14350 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
14360 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
14370 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
14380 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14390 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63  k;.. sem_end_loc
143a0 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k:.  return rc;.
143b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
143c0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
143d0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
143e0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
143f0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
14400 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
14410 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
14420 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
14430 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
14440 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
14450 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
14460 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
14470 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
14480 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
14490 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
144a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
144b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
144c0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
144d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
144e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
144f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14500 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
14510 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
14520 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14530 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14540 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14550 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14560 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14570 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14580 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14590 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
145a0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
145b0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
145c0 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
145d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
145e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
145f0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
14600 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
14610 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
14620 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
14630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14640 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
14650 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
14660 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
14670 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
14680 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
14690 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
146a0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
146b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
146c0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
146d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
146e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
146f0 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c  * no, really unl
14700 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  ock. */.  if ( s
14710 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d  em_post(pSem)==-
14720 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
14730 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  , tErrno = errno
14740 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14750 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
14760 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
14770 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
14780 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
14790 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
147a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
147b0 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
147c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
147d0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
147e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
147f0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
14800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14810 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
14820 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
14830 69 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c  int semClose(sql
14840 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
14850 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
14860 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14870 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14880 3b 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28  ;.    semUnlock(
14890 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
148a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
148b0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
148c0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
148d0 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
148e0 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
148f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
14900 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
14910 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
14930 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
14940 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
14950 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
14960 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
14970 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
14980 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
14990 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
149a0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
149b0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
149c0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
149d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
149e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a20 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
14a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a70 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14a90 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
14aa0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
14ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ac0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
14ad0 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
14ae0 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
14af0 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
14b00 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
14b10 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
14b20 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
14b30 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
14b40 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
14b50 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
14b60 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
14b70 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
14b80 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
14b90 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
14ba0 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
14bb0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
14bc0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
14bd0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
14be0 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
14bf0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
14c00 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
14c10 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
14c20 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
14c30 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
14c40 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14c50 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14c60 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
14c70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
14c80 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
14c90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
14ca0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
14cb0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14cc0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
14cd0 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
14ce0 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
14cf0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14d00 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
14d10 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
14d20 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
14d30 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
14d40 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
14d50 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
14d60 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
14d70 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
14d80 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
14d90 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
14da0 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
14db0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
14dc0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
14dd0 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
14de0 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
14df0 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
14e00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
14e10 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
14e20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
14e30 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
14e40 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
14e50 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
14e80 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
14e90 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
14ea0 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
14eb0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
14ec0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
14ed0 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
14ee0 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
14ef0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
14f00 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
14f10 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
14f20 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
14f30 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
14f40 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
14f50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14f60 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
14f70 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
14f80 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
14f90 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
14fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
14fb0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
14fc0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
14fd0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
14fe0 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
14ff0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15000 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15010 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
15020 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
15030 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
15040 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
15050 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
15060 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
15070 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15080 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
15090 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
150a0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
150b0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
150c0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
150d0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
150e0 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
150f0 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
15100 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
15110 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
15120 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
15130 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
15140 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
15150 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
15160 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
15170 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
15180 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
15190 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
151a0 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
151b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
151c0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
151d0 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
151e0 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
151f0 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
15200 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
15210 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
15220 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
15230 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
15240 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
15250 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
15260 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
15270 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
15280 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
15290 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
152a0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
152b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
152c0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
152d0 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
152e0 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
152f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
15300 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
15310 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
15320 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
15330 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
15340 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
15350 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
15360 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
15370 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
15380 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
153b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
153c0 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
153d0 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
153e0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
153f0 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
15400 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
15410 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15420 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
15430 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
15440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15450 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
15460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15470 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
15480 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15490 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
154a0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
154b0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
154c0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
154d0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
154e0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
154f0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
15500 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
15510 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
15520 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
15530 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
15540 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
15550 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15560 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
15570 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
15580 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
15590 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
155a0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
155b0 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
155c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
155d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
155e0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
155f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15600 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
15610 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
15620 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
15630 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
15640 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
15650 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
15660 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
15670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
15680 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
15690 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
156a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
156b0 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
156c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
156d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
156e0 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
156f0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
15700 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
15710 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
15720 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15730 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
15740 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
15750 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
15760 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
15770 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
15780 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
15790 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
157a0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
157b0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
157c0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
157d0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
157e0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
157f0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
15800 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
15810 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
15820 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
15830 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
15840 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
15850 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
15860 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
15870 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
15880 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
15890 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
158a0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
158b0 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
158c0 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
158d0 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
158e0 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
158f0 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
15900 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
15910 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
15920 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
15930 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
15940 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
15950 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
15960 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
15970 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
15980 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
15990 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
159a0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
159b0 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
159c0 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
159d0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
159e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
159f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15a00 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
15a10 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
15a20 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
15a30 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
15a40 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
15a50 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
15a60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
15a70 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
15a80 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
15a90 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
15aa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
15ab0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
15ac0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
15ad0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
15ae0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
15af0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
15b00 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
15b10 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
15b20 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
15b30 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
15b40 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
15b50 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
15b60 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
15b70 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
15b80 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
15b90 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
15ba0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
15bb0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
15bc0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
15bd0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
15be0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
15bf0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
15c00 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
15c10 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
15c20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
15c30 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
15c40 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
15c50 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
15c60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
15c70 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
15c80 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
15c90 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
15ca0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
15cb0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
15cc0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
15cd0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
15ce0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
15cf0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15d00 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15d10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
15d20 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
15d30 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15d40 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
15d50 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
15d60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
15d70 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
15d80 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
15d90 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
15da0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
15db0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
15dc0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
15dd0 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
15de0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15df0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
15e00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15e10 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
15e20 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15e30 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
15e40 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
15e50 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
15e60 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
15e70 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
15e80 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
15e90 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
15ea0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
15eb0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
15ec0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
15ed0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
15ee0 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
15ef0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15f00 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
15f10 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
15f20 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
15f30 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
15f40 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
15f50 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
15f60 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
15f70 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
15f80 64 20 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a  d , getpid()));.
15f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
15fa0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
15fb0 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
15fc0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
15fd0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
15fe0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
15ff0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
16000 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
16010 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16020 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16030 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16040 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16050 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16060 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16070 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16080 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16090 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
160a0 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
160b0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
160c0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
160d0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
160e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
160f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
16100 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
16110 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16120 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16130 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16140 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16150 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16160 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16170 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16180 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16190 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
161a0 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
161b0 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
161c0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
161d0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
161e0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
161f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
16200 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16210 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16220 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16230 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16240 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16250 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16260 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16270 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16280 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16290 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
162a0 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
162b0 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
162c0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
162d0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
162e0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
162f0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
16300 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
16310 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16320 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16330 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16340 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16350 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16360 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16370 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16380 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16390 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
163a0 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
163b0 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
163c0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
163d0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
163e0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
163f0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16400 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16410 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16420 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
16430 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16440 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16450 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16460 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
16470 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
16480 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16490 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
164a0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
164b0 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
164c0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
164d0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
164e0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
164f0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
16500 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
16510 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16520 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16530 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16540 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16550 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16560 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16570 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16580 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16590 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
165a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
165b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
165c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
165d0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
165e0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
165f0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
16600 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
16610 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16620 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16630 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16640 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16650 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16660 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16670 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16680 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16690 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
166a0 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
166b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
166c0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
166d0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
166e0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
166f0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
16700 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16710 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16720 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
16730 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
16740 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16750 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
16760 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
16770 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
16780 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16790 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
167a0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
167b0 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
167c0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
167d0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
167e0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
167f0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
16800 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
16810 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16820 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16830 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16840 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16850 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16860 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16870 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16880 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16890 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
168a0 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
168b0 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
168c0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
168d0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
168e0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
168f0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16900 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16910 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16920 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16930 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16940 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16950 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16960 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16970 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16980 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
16990 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
169a0 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
169b0 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
169c0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
169d0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
169e0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
169f0 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16a00 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16a10 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16a20 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16a30 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16a40 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16a50 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16a60 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16a70 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16a80 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
16a90 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16aa0 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
16ab0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
16ac0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
16ad0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
16ae0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
16af0 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
16b00 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
16b10 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16b20 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16b30 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16b40 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
16b50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
16b60 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
16b70 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
16b80 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rc1Errno;.      
16b90 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
16ba0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16bb0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16bc0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16bd0 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
16be0 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
16bf0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16c00 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16c10 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
16c20 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
16c30 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
16c40 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
16c50 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16c60 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16c70 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16c80 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
16c90 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
16ca0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16cb0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
16cc0 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
16cd0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
16ce0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
16cf0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
16d00 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
16d10 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
16d20 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
16d30 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
16d40 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
16d50 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
16d60 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16d70 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
16d80 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
16d90 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
16da0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
16db0 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
16dc0 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
16dd0 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
16de0 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
16df0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
16e00 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
16e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16e20 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
16e30 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
16e40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
16e50 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
16e60 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
16e70 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16e80 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
16e90 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
16ea0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
16eb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
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 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
16f00 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
16f10 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
16f20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
16f30 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
16f40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16f50 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
16f60 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
16f70 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
16f80 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
16f90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16fa0 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
16fb0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
16fc0 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
16fd0 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
16fe0 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
16ff0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
17000 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17010 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
17020 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
17030 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
17040 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
17050 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
17060 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17070 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
17080 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
170b0 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
170c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
170d0 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
170e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
170f0 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
17100 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
17110 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
17120 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17130 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17140 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17150 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
17180 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
17190 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
171a0 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
171b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
171c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
171d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
171e0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
171f0 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
17200 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17210 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
17220 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
17230 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
17240 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
17250 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
17260 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
17270 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
17280 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
17290 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
172a0 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
172b0 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
172c0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
172d0 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
172e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
172f0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
17300 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17310 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
17320 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
17330 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
17340 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
17350 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
17360 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
17370 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
17380 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
17390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
173a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
173b0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
173c0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
173d0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
173e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
173f0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17400 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
17410 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17420 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
17430 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17440 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
17450 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
17460 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
17470 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
17480 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17490 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
174a0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
174b0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
174c0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
174d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
174e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
174f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
17510 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17520 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
17530 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
17540 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
17550 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
17560 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
17570 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
17580 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
17590 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
175a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
175b0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
175c0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
175d0 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
175e0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
175f0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17610 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
17620 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
17630 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
17640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17650 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17660 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17670 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
17680 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
17690 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
176a0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
176b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
176c0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
176d0 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
176e0 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
176f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17700 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
17710 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
17720 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
17730 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
17740 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
17750 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
17760 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17770 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
17780 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17790 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
177a0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
177b0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
177c0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
177d0 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
177e0 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
177f0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
17800 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
17810 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17820 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
17830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17840 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
17850 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
17860 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
17870 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
17880 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17890 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
178a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
178b0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
178c0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
178d0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
178e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
178f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
17900 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
17910 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17920 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
17930 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
17940 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
17950 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
17960 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
17970 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
17980 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
17990 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
179a0 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
179b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
179c0 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
179d0 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
179e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
179f0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
17a00 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
17a10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17a20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
17a30 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
17a40 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
17a50 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
17a60 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
17a70 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
17a80 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
17a90 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
17aa0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
17ab0 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
17ac0 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
17ad0 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
17ae0 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
17af0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
17b00 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
17b10 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
17b20 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
17b30 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
17b40 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
17b50 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
17b60 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
17b70 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
17b80 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
17b90 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
17ba0 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
17bb0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
17bc0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
17bd0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
17be0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17bf0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
17c00 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
17c10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17c20 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
17c30 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
17c40 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
17c50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17c60 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
17c70 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
17c80 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
17c90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
17ca0 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
17cb0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17cc0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
17cd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
17ce0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
17cf0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
17d00 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
17d10 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
17d20 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17d30 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
17d40 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
17d50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
17d60 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
17d70 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
17d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17da0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
17db0 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
17dc0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
17dd0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17de0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17df0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
17e00 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
17e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17e20 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
17e30 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
17e40 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
17e50 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
17e60 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
17e70 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
17e80 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
17e90 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
17ea0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
17eb0 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
17ec0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
17ed0 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
17ee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
17f00 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17f10 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17f20 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
17f30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
17f40 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
17f50 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
17f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f70 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
17f80 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
17f90 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
17fa0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
17fb0 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
17fc0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
17fd0 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
17fe0 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
17ff0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
18000 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
18010 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
18020 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
18030 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
18040 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
18050 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
18060 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
18070 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
18080 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
18090 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
180a0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
180b0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
180c0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
180d0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
180e0 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
180f0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18100 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
18110 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
18120 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
18130 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
18140 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18150 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
18160 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
18170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18180 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
18190 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
181a0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
181b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
181c0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
181d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
181e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
181f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18200 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
18210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18220 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
18230 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
18240 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
18250 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
18260 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
18270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18280 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
18290 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
182a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
182b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
182c0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
182d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
182e0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
182f0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
18300 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
18310 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
18320 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
18330 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
18340 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
18350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
18360 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
18370 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18380 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
18390 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
183a0 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
183b0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
183c0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
183d0 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
183e0 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
183f0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18400 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18410 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18420 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
18430 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
18440 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
18450 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
18460 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
18470 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
18480 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
18490 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
184a0 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
184b0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
184c0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
184d0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
184e0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
184f0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
18500 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
18510 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
18520 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
18530 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
18540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
18550 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18560 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
18570 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
18580 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
18590 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
185a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
185b0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
185c0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
185d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
185e0 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
185f0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
18600 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
18610 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
18620 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
18630 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
18640 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
18650 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
18660 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
18670 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
18680 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
18690 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
186a0 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
186b0 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
186c0 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
186d0 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
186e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186f0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
18700 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
18710 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
18720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18780 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
18790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
187e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
187f0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
18800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
18820 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
18830 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
18840 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
18850 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
18860 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
18870 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
18880 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
18890 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
188a0 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
188b0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
188c0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
188d0 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
188e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
188f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
18900 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
18910 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
18920 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
18930 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
18940 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18950 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
18960 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
18970 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
18980 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
18990 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
189a0 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
189b0 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
189c0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
189d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
189e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
189f0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
18a00 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
18a10 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
18a20 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
18a30 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
18a40 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
18a50 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
18a60 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
18a70 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
18a80 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
18a90 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
18aa0 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
18ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
18ac0 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
18ad0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
18ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18af0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b40 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
18b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18ba0 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
18bb0 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
18bc0 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
18bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18be0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
18bf0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
18c00 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
18c10 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
18c20 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
18c30 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
18c40 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
18c50 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
18c60 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
18c70 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
18c80 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
18c90 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
18ca0 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
18cb0 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
18cc0 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
18cd0 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
18ce0 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
18cf0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
18d00 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
18d10 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
18d20 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
18d30 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
18d40 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
18d50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
18d60 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
18d70 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
18d80 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
18d90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
18da0 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
18db0 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
18dc0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
18dd0 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
18de0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
18df0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
18e00 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
18e10 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
18e20 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
18e30 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
18e40 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
18e50 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
18e60 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
18e70 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
18e80 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
18e90 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
18ea0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
18eb0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
18ec0 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
18ed0 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
18ee0 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
18ef0 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
18f00 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
18f10 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
18f20 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
18f30 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
18f40 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
18f50 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
18f60 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
18f70 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
18f80 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
18f90 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
18fa0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e  .  int got;.  in
18fb0 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66  t prior = 0;.#if
18fc0 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
18fd0 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
18fe0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
18ff0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
19000 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
19010 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28  START;.  assert(
19020 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66   cnt==(cnt&0x1ff
19030 66 66 29 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20  ff) );.  cnt &= 
19040 30 78 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23  0x1ffff;.  do{.#
19050 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19060 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20  READ).    got = 
19070 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  osPread(id->h, p
19080 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
19090 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
190a0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
190b0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
190c0 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
190d0 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64     got = osPread
190e0 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  64(id->h, pBuf, 
190f0 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
19100 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
19110 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
19120 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73  else.    newOffs
19130 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
19140 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
19150 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
19160 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66  eIOError( newOff
19170 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28  set-- );.    if(
19180 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73   newOffset!=offs
19190 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  et ){.      if( 
191a0 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20  newOffset == -1 
191b0 29 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69  ){.        ((uni
191c0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
191d0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
191e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
191f0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
19200 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
19210 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19220 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
19230 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52   }.    got = osR
19240 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
19250 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
19260 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29    if( got==cnt )
19270 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
19280 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  got<0 ){.      i
19290 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  f( errno==EINTR 
192a0 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74  ){ got = 1; cont
192b0 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72  inue; }.      pr
192c0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28  ior = 0;.      (
192d0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
192e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
192f0 6f 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  o;.      break;.
19300 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f      }else if( go
19310 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  t>0 ){.      cnt
19320 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f   -= got;.      o
19330 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20  ffset += got;.  
19340 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74      prior += got
19350 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28  ;.      pBuf = (
19360 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68  void*)(got + (ch
19370 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d  ar*)pBuf);.    }
19380 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30  .  }while( got>0
19390 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b   );.  TIMER_END;
193a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
193b0 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
193c0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20  lld %llu\n",.   
193d0 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20           id->h, 
193e0 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65  got+prior, offse
193f0 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45  t-prior, TIMER_E
19400 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
19410 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a  rn got+prior;.}.
19420 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
19430 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
19440 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
19450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
19460 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
19470 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
19480 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
19490 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
194a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
194b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
194c0 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
194d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
194e0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
194f0 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
19500 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
19510 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
19520 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
19530 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
19540 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
19550 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
19560 20 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20   iMap = 0;      
19570 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
19580 74 20 6f 66 20 73 74 61 72 74 20 6f 66 20 6d 61  t of start of ma
19590 70 70 69 6e 67 20 69 20 2a 2f 0a 20 20 69 6e 74  pping i */.  int
195a0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195c0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
195d0 74 68 72 6f 75 67 68 20 6d 61 70 70 69 6e 67 73  through mappings
195e0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
195f0 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
19600 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
19610 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
19620 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
19630 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
19640 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
19650 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
19660 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
19670 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
19680 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
19690 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
196a0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
196b0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
196c0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
196d0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
196e0 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
196f0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
19700 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
19710 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
19720 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
19730 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
19740 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
19750 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
19760 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
19770 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
19780 2b 29 7b 0a 20 20 20 20 75 6e 69 78 4d 61 70 70  +){.    unixMapp
19790 69 6e 67 20 2a 70 4d 61 70 20 3d 20 26 70 46 69  ing *pMap = &pFi
197a0 6c 65 2d 3e 61 4d 6d 61 70 5b 69 5d 3b 0a 20 20  le->aMmap[i];.  
197b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
197c0 69 45 6e 64 20 3d 20 69 4d 61 70 20 2b 20 70 4d  iEnd = iMap + pM
197d0 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 20 20  ap->mmapSize;.  
197e0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 69 45 6e    if( offset<iEn
197f0 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  d ){.      if( o
19800 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 69 45 6e  ffset+amt <= iEn
19810 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  d ){.        mem
19820 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
19830 2a 29 28 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67  *)(pMap->pMapReg
19840 69 6f 6e 29 29 5b 6f 66 66 73 65 74 2d 69 4d 61  ion))[offset-iMa
19850 70 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  p], amt);.      
19860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19870 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
19880 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
19890 70 79 20 3d 20 69 45 6e 64 20 2d 20 6f 66 66 73  py = iEnd - offs
198a0 65 74 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  et;.        memc
198b0 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
198c0 29 28 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69  )(pMap->pMapRegi
198d0 6f 6e 29 29 5b 6f 66 66 73 65 74 2d 69 4d 61 70  on))[offset-iMap
198e0 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
198f0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
19900 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
19910 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e          amt -= n
19920 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 6f 66  Copy;.        of
19930 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
19940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19950 20 69 4d 61 70 20 3d 20 70 4d 61 70 2d 3e 6d 6d   iMap = pMap->mm
19960 61 70 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 67  apSize;.  }..  g
19970 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
19980 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
19990 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
199a0 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
199b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
199c0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
199d0 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
199e0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
199f0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
19a00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19a10 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
19a20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
19a30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
19a40 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
19a50 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
19a60 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
19a70 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
19a80 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
19a90 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
19aa0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
19ab0 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
19ac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19ad0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
19ae0 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
19af0 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66   Seek to the off
19b00 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65  set in id->offse
19b10 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  t then read cnt 
19b20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
19b30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19b40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
19b50 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55  ctually read.  U
19b60 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74  pdate the offset
19b70 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19b80 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19b90 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
19ba0 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20  ailed write the 
19bb0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
19bc0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
19bd0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
19be0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
19bf0 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20  dWrite(unixFile 
19c00 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *id, i64 offset,
19c10 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
19c20 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
19c30 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28 21 64 65  nt got;.#if (!de
19c40 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
19c50 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
19c60 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
19c70 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
19c80 69 66 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  if.  assert( cnt
19c90 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
19ca0 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66  );.  cnt &= 0x1f
19cb0 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  fff;.  TIMER_STA
19cc0 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
19cd0 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
19ce0 20 67 6f 74 20 3d 20 6f 73 50 77 72 69 74 65 28   got = osPwrite(
19cf0 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
19d00 2c 20 6f 66 66 73 65 74 29 3b 20 7d 77 68 69 6c  , offset); }whil
19d10 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e  e( got<0 && errn
19d20 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
19d30 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19d40 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 67 6f 74  EAD64).  do{ got
19d50 20 3d 20 6f 73 50 77 72 69 74 65 36 34 28 69 64   = osPwrite64(id
19d60 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
19d70 6f 66 66 73 65 74 29 3b 7d 77 68 69 6c 65 28 20  offset);}while( 
19d80 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
19d90 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
19da0 64 6f 7b 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  do{.    newOffse
19db0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
19dc0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
19dd0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
19de0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
19df0 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20  et-- );.    if( 
19e00 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65  newOffset!=offse
19e10 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  t ){.      if( n
19e20 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29  ewOffset == -1 )
19e30 7b 0a 20 20 20 20 20 20 20 20 28 28 75 6e 69 78  {.        ((unix
19e40 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
19e50 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19e70 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
19e80 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  d)->lastErrno = 
19e90 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
19ea0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
19eb0 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 57 72  }.    got = osWr
19ec0 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
19ed0 20 63 6e 74 29 3b 0a 20 20 7d 77 68 69 6c 65 28   cnt);.  }while(
19ee0 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
19ef0 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66  =EINTR );.#endif
19f00 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
19f10 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
19f20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
19f30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
19f40 72 6e 6f 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  rno;.  }..  OSTR
19f50 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
19f60 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
19f70 75 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74  u\n", id->h, got
19f80 2c 20 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  , offset, TIMER_
19f90 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
19fa0 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
19fb0 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
19fc0 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
19fd0 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
19fe0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
19ff0 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
1a000 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1a010 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
1a020 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1a030 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
1a040 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f  _file *id, .  co
1a050 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1a060 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
1a070 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1a080 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  et .){.  unixFil
1a090 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a0a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
1a0b0 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
1a0c0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
1a0d0 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
1a0e0 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
1a0f0 5f 69 6e 74 36 34 20 69 4d 61 70 20 3d 20 30 3b  _int64 iMap = 0;
1a100 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1a110 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  s a database fil
1a120 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
1a130 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  , master-journal
1a140 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69   or temp.  ** fi
1a150 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69  le), the bytes i
1a160 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  n the locking ra
1a170 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  nge should never
1a180 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
1a190 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20  ten. */.#if 0.  
1a1a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
1a1b0 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20  Unused==0.      
1a1c0 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44   || offset>=PEND
1a1d0 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20  ING_BYTE+512.   
1a1e0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d      || offset+am
1a1f0 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  t<=PENDING_BYTE 
1a200 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  .  );.#endif..#i
1a210 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a220 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  G.  /* If we are
1a230 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1a240 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1a250 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1a260 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69  osed to.  ** doi
1a270 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1a280 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77   rollback or a w
1a290 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c  rite to some fil
1a2a0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20  e other than a. 
1a2b0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1a2c0 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72  ase file) then r
1a2d0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
1a2e0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1a2f0 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65  .  ** has change
1a300 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
1a310 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
1a320 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f  s modified, reco
1a330 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63  rd that.  ** fac
1a340 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  t too..  */.  if
1a350 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
1a360 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46  lWrite ){.    pF
1a370 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
1a380 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  1;  /* The datab
1a390 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
1a3a0 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  ified */.    if(
1a3b0 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f   offset<=24 && o
1a3c0 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b  ffset+amt>=27 ){
1a3d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1a3e0 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74       char oldCnt
1a3f0 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75  r[4];.      Simu
1a400 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a410 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  n(1);.      rc =
1a420 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1a430 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c  le, 24, oldCntr,
1a440 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   4);.      Simul
1a450 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1a460 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  (0);.      if( r
1a470 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f  c!=4 || memcmp(o
1a480 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a  ldCntr, &((char*
1a490 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74  )pBuf)[24-offset
1a4a0 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ], 4)!=0 ){.    
1a4b0 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1a4c0 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f  CntrChng = 1;  /
1a4d0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1a4e0 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68  n counter has ch
1a4f0 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d  anged */.      }
1a500 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a510 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  f..  for(i=0; i<
1a520 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 69  2; i++){.    uni
1a530 78 4d 61 70 70 69 6e 67 20 2a 70 4d 61 70 20 3d  xMapping *pMap =
1a540 20 26 70 46 69 6c 65 2d 3e 61 4d 6d 61 70 5b 69   &pFile->aMmap[i
1a550 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ];.    sqlite3_i
1a560 6e 74 36 34 20 69 45 6e 64 20 3d 20 69 4d 61 70  nt64 iEnd = iMap
1a570 20 2b 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a   + pMap->mmapSiz
1a580 65 3b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  e;.    if( offse
1a590 74 3c 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  t<iEnd ){.      
1a5a0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1a5b0 3d 20 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  = iEnd ){.      
1a5c0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1a5d0 29 28 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69  )(pMap->pMapRegi
1a5e0 6f 6e 29 29 5b 6f 66 66 73 65 74 2d 69 4d 61 70  on))[offset-iMap
1a5f0 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
1a600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1a610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1a620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1a630 74 20 6e 43 6f 70 79 20 3d 20 69 45 6e 64 20 2d  t nCopy = iEnd -
1a640 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
1a650 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1a660 28 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69 6f  (pMap->pMapRegio
1a670 6e 29 29 5b 6f 66 66 73 65 74 2d 69 4d 61 70 5d  n))[offset-iMap]
1a680 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
1a690 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20 26          pBuf = &
1a6a0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1a6b0 70 79 5d 3b 0a 20 20 20 20 20 20 20 20 61 6d 74  py];.        amt
1a6c0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1a6d0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1a6e0 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  py;.      }.    
1a6f0 7d 0a 20 20 20 20 69 4d 61 70 20 3d 20 70 4d 61  }.    iMap = pMa
1a700 70 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 20 20 7d  p->mmapSize;.  }
1a710 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ..  while( amt>0
1a720 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
1a730 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1a740 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1a750 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
1a760 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1a770 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1a780 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1a790 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1a7a0 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1a7b0 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1a7c0 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1a7d0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1a7e0 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1a7f0 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1a800 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
1a810 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1a820 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1a830 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1a840 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1a850 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1a860 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1a870 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a880 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1a890 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1a8a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20 2f  lastErrno = 0; /
1a8b0 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
1a8c0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
1a8d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1a8e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1a8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a900 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1a910 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1a920 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1a930 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1a940 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1a950 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1a960 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1a970 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1a980 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1a990 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1a9a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a9b0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1a9c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1a9d0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1a9e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1a9f0 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1aa00 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1aa10 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1aa20 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1aa30 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1aa40 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1aa50 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1aa60 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1aa70 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1aa80 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1aa90 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1aaa0 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1aab0 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1aac0 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1aad0 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1aae0 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1aaf0 61 74 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21  atasync.*/.#if !
1ab00 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1ab10 63 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  c).# define fdat
1ab20 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
1ab30 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
1ab40 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1ab50 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
1ab60 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1ab70 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
1ab80 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
1ab90 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
1aba0 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
1abb0 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
1abc0 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
1abd0 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
1abe0 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
1abf0 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
1ac00 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
1ac10 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
1ac20 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
1ac30 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
1ac40 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
1ac50 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
1ac60 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
1ac70 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
1ac80 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
1ac90 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
1aca0 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
1acb0 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
1acc0 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
1acd0 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
1ace0 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
1acf0 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
1ad00 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
1ad10 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
1ad20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
1ad30 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
1ad40 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
1ad50 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
1ad60 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
1ad70 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
1ad80 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
1ad90 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
1ada0 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
1adb0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
1adc0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1add0 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
1ade0 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
1adf0 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
1ae00 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
1ae10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ae20 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73  ..**.** SQLite s
1ae30 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79  ets the dataOnly
1ae40 20 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a   flag if the siz
1ae50 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
1ae60 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54   unchanged..** T
1ae70 68 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64  he idea behind d
1ae80 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20  ataOnly is that 
1ae90 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77  it should only w
1aea0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f  rite the file co
1aeb0 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b  ntent.** to disk
1aec0 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e  , not the inode.
1aed0 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61    We only set da
1aee0 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69  taOnly if the fi
1aef0 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75  le size is .** u
1af00 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74  nchanged since t
1af10 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  he file size is 
1af20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64  part of the inod
1af30 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a  e.  However, .**
1af40 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20   Ted Ts'o tells 
1af50 75 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e  us that fdatasyn
1af60 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72  c() will also wr
1af70 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66  ite the inode if
1af80 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a   the.** file siz
1af90 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20  e has changed.  
1afa0 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69  The only real di
1afb0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1afc0 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20   fdatasync().** 
1afd0 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64  and fsync(), Ted
1afe0 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68   tells us, is th
1aff0 61 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77  at fdatasync() w
1b000 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68  ill not flush th
1b010 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68  e.** inode if th
1b020 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72  e mtime or owner
1b030 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20   or other inode 
1b040 61 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20  attributes have 
1b050 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f  changed..** We o
1b060 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74  nly care about t
1b070 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f  he file size, no
1b080 74 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65  t the other file
1b090 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a   attributes, so.
1b0a0 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c  ** as far as SQL
1b0b0 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64  ite is concerned
1b0c0 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29  , an fdatasync()
1b0d0 20 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75   is always adequ
1b0e0 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61  ate..** So, we a
1b0f0 6c 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73  lways use fdatas
1b100 79 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61  ync() if it is a
1b110 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64  vailable, regard
1b120 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76  less of.** the v
1b130 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
1b140 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74  Only flag..*/.st
1b150 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
1b160 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
1b170 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
1b180 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
1b190 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  c;..  /* The fol
1b1a0 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c  lowing "ifdef/el
1b1b0 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20  if/else/" block 
1b1c0 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72  has the same str
1b1d0 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74  ucture as.  ** t
1b1e0 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74  he one below. It
1b1f0 20 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68   is replicated h
1b200 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76  ere solely to av
1b210 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a  oid cluttering .
1b220 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c    ** up the real
1b230 20 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55   code with the U
1b240 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b250 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23  ) macros..  */.#
1b260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
1b270 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1b280 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
1b290 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b2a0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55  fullSync);.  UNU
1b2b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1b2c0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48  taOnly);.#elif H
1b2d0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
1b2e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b2f0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73  (dataOnly);.#els
1b300 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
1b310 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a  ETER(fullSync);.
1b320 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b330 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1b340 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  ndif..  /* Recor
1b350 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
1b360 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
1b370 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
1b380 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
1b390 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
1b3a0 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
1b3b0 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
1b3c0 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
1b3d0 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
1b3e0 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
1b3f0 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
1b400 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b410 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
1b420 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
1b430 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
1b440 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
1b450 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
1b460 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
1b470 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
1b480 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
1b490 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
1b4a0 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
1b4b0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1b4c0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
1b4d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
1b4e0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1b4f0 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
1b500 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   ){.    rc = osF
1b510 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1b520 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  SYNC, 0);.  }els
1b530 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1b540 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1b550 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1b560 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1b570 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1b580 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
1b590 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1b5a0 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1b5b0 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1b5c0 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
1b5d0 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1b5e0 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1b5f0 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1b600 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
1b610 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1b620 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1b630 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1b640 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
1b650 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1b660 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1b670 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1b680 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
1b690 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1b6a0 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1b6b0 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1b6c0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
1b6d0 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1b6e0 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1b6f0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
1b700 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
1b710 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
1b720 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1b730 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61  LE__).  /* fdata
1b740 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64  sync() on HFS+ d
1b750 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68  oesn't yet flush
1b760 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1b770 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72  f it changed cor
1b780 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63  rectly.  ** so c
1b790 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61  urrently we defa
1b7a0 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  ult to the macro
1b7b0 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20   that redefines 
1b7c0 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79  fdatasync to fsy
1b7d0 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  nc.  */.  rc = f
1b7e0 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20  sync(fd);.#else 
1b7f0 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e  .  rc = fdatasyn
1b800 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58  c(fd);.#if OS_VX
1b810 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d  WORKS.  if( rc==
1b820 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  -1 && errno==ENO
1b830 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d  TSUP ){.    rc =
1b840 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a   fsync(fd);.  }.
1b850 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1b860 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ORKS */.#endif /
1b870 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  * ifdef SQLITE_N
1b880 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45  O_SYNC elif HAVE
1b890 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20  _FULLFSYNC */.. 
1b8a0 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
1b8b0 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20  && rc!= -1 ){.  
1b8c0 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    rc = 0;.  }.  
1b8d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b8e0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1b8f0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1b900 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1b910 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1b920 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1b930 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1b940 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1b950 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1b960 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1b970 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b980 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1b990 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1b9a0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1b9b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1b9c0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1b9d0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1b9e0 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1b9f0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lue..**.** The d
1ba00 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1ba10 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64  scriptor is used
1ba20 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68   for only one th
1ba30 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e  ing - to.** fsyn
1ba40 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20  c() a directory 
1ba50 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c  to make sure fil
1ba60 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64  e creation and d
1ba70 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a  eletion events.*
1ba80 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  * are flushed to
1ba90 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79   disk.  Such fsy
1baa0 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ncs are not need
1bab0 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a  ed on newer.** j
1bac0 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79  ournaling filesy
1bad0 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72  stems, but are r
1bae0 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72  equired on older
1baf0 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
1bb00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bb10 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
1bb20 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65  en using the xSe
1bb30 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61  tSysCall interfa
1bb40 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69  ce..** The abili
1bb50 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74  ty to override t
1bb60 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1bb70 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74  added in support
1bb80 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d   of the.** chrom
1bb90 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70  ium sandbox.  Op
1bba0 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ening a director
1bbb0 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20  y is a security 
1bbc0 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20  risk (we are.** 
1bbd0 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20  told) so making 
1bbe0 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  it overrideable 
1bbf0 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d  allows the chrom
1bc00 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a  ium sandbox to.*
1bc10 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72  * replace this r
1bc20 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61  outine with a ha
1bc30 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54  rmless no-op.  T
1bc40 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74  o make this rout
1bc50 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20  ine.** a no-op, 
1bc60 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
1bc70 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75  a stub that retu
1bc80 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  rns SQLITE_OK bu
1bc90 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64  t leaves.** *pFd
1bca0 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69   set to a negati
1bcb0 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ve number..**.**
1bcc0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1bcd0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1bce0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1bcf0 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1bd00 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1bd10 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1bd20 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1bd30 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1bd40 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1bd50 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1bd60 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1bd70 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1bd80 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1bd90 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1bda0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1bdb0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1bdc0 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1bdd0 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1bde0 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1bdf0 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1be00 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
1be10 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1be20 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1be30 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1be40 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1be50 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
1be60 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1be70 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1be80 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
1be90 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1bea0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1beb0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1bec0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
1bed0 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
1bee0 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
1bef0 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72  ITE_OK:unixLogEr
1bf00 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1bf10 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
1bf20 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a  , zDirname));.}.
1bf30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1bf40 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1bf50 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1bf60 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1bf70 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
1bf80 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
1bf90 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
1bfa0 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
1bfb0 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
1bfc0 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
1bfd0 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
1bfe0 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
1bff0 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
1c000 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
1c010 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1c020 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
1c030 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1c040 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1c050 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
1c060 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
1c070 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
1c080 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
1c090 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1c0a0 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
1c0b0 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
1c0c0 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
1c0d0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
1c0e0 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
1c0f0 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
1c100 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1c110 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
1c120 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
1c130 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
1c140 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
1c150 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
1c160 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1c170 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
1c180 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
1c190 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1c1a0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
1c1b0 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
1c1c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
1c1d0 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
1c1e0 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
1c1f0 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
1c200 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1c210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1c220 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
1c230 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
1c240 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
1c250 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1c260 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1c270 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
1c280 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
1c290 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
1c2a0 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
1c2b0 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
1c2c0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1c2d0 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
1c2e0 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
1c2f0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1c300 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
1c310 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
1c320 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
1c330 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1c340 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
1c350 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1c360 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
1c370 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
1c380 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
1c390 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
1c3a0 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
1c3b0 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
1c3c0 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
1c3d0 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
1c3e0 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1c3f0 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
1c400 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1c410 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
1c420 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
1c430 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1c440 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
1c450 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
1c460 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
1c470 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
1c480 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
1c490 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
1c4a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c4b0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1c4c0 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
1c4d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1c4e0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1c4f0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c500 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
1c510 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
1c520 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1c530 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
1c540 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
1c550 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c560 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
1c570 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
1c580 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
1c590 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
1c5a0 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
1c5b0 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
1c5c0 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
1c5d0 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
1c5e0 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
1c5f0 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
1c600 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
1c610 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
1c620 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1c630 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
1c640 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
1c650 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
1c660 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
1c670 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
1c680 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
1c690 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
1c6a0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
1c6b0 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
1c6c0 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
1c6d0 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
1c6e0 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
1c6f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c700 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30  E_OK && dirfd>=0
1c710 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66   ){.      full_f
1c720 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30  sync(dirfd, 0, 0
1c730 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
1c740 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
1c750 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1c760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1c770 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1c780 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1c7a0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1c7b0 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
1c7c0 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20  E_DIRSYNC;.  }. 
1c7d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c7e0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
1c7f0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
1c800 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
1c810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1c820 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
1c830 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1c840 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
1c850 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c860 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
1c870 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1c880 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
1c890 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1c8a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c8b0 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
1c8c0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
1c8d0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
1c8e0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
1c8f0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
1c900 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
1c910 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
1c920 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
1c930 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
1c940 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
1c950 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
1c960 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
1c970 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
1c980 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
1c990 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
1c9a0 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
1c9b0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
1c9c0 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
1c9d0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
1c9e0 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
1c9f0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1ca00 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1ca10 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
1ca20 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
1ca30 65 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e 42 79  e->h, (off_t)nBy
1ca40 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1ca50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1ca60 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
1ca70 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1ca80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1ca90 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1caa0 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1cab0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1cac0 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 23  e{.    int i;..#
1cad0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1cae0 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  UG.    /* If we 
1caf0 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1cb00 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1cb10 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1cb20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a  opposed to.    *
1cb30 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1cb40 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1cb50 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1cb60 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1cb70 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61  n a.    ** norma
1cb80 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1cb90 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65   and we truncate
1cba0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1cbb0 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a  o length,.    **
1cbc0 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65 6c   that effectivel
1cbd0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1cbe0 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54  ange counter.  T
1cbf0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1cc00 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73  .    ** when res
1cc10 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61 73  toring a databas
1cc20 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b  e using the back
1cc30 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65  up API from a ze
1cc40 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  ro-length.    **
1cc50 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a   source..    */.
1cc60 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69      if( pFile->i
1cc70 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
1cc80 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
1cc90 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1cca0 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20  trChng = 1;.    
1ccb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1ccc0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1ccd0 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
1cce0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
1ccf0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1cd00 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
1cd10 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
1cd20 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1cd30 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
1cd40 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
1cd50 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
1cd60 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
1cd70 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
1cd80 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
1cd90 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a   from now on.  .
1cda0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1cdb0 3d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  =1; i>=0; i--){.
1cdc0 20 20 20 20 20 20 75 6e 69 78 4d 61 70 70 69 6e        unixMappin
1cdd0 67 20 2a 70 4d 61 70 20 3d 20 26 70 46 69 6c 65  g *pMap = &pFile
1cde0 2d 3e 61 4d 6d 61 70 5b 69 5d 3b 0a 20 20 20 20  ->aMmap[i];.    
1cdf0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1ce00 69 45 6e 64 20 3d 20 70 4d 61 70 2d 3e 6d 6d 61  iEnd = pMap->mma
1ce10 70 53 69 7a 65 20 2b 20 28 69 3d 3d 31 20 3f 20  pSize + (i==1 ? 
1ce20 70 4d 61 70 5b 2d 31 5d 2e 6d 6d 61 70 53 69 7a  pMap[-1].mmapSiz
1ce30 65 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66  e : 0);.      if
1ce40 28 20 6e 42 79 74 65 3c 69 45 6e 64 20 29 7b 0a  ( nByte<iEnd ){.
1ce50 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 6d 6d          pMap->mm
1ce60 61 70 53 69 7a 65 20 2d 3d 20 28 69 45 6e 64 20  apSize -= (iEnd 
1ce70 2d 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  - nByte);.      
1ce80 20 20 69 66 28 20 70 4d 61 70 2d 3e 6d 6d 61 70    if( pMap->mmap
1ce90 53 69 7a 65 3c 30 20 29 20 70 4d 61 70 2d 3e 6d  Size<0 ) pMap->m
1cea0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1ceb0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1cec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ced0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1cee0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1cef0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1cf00 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1cf10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1cf20 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1cf30 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1cf40 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1cf50 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1cf60 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1cf70 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1cf80 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1cf90 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1cfa0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1cfb0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1cfc0 63 21 3d 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  c!=0 ){.    ((un
1cfd0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
1cfe0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
1cff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d000 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1d010 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
1d020 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a  f.st_size;..  /*
1d030 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1d040 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61  zero-size databa
1d050 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64  se, the findInod
1d060 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  eInfo() procedur
1d070 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
1d080 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
1d090 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
1d0a0 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
1d0b0 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
1d0c0 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
1d0d0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
1d0e0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
1d0f0 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
1d100 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
1d110 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
1d120 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
1d130 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
1d140 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
1d150 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
1d160 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
1d170 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
1d180 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
1d190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d1a0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1d1b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1d1c0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1d1d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
1d1e0 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
1d1f0 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
1d200 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
1d210 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
1d220 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
1d230 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
1d240 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1d250 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
1d260 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1d270 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
1d280 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  dif../* .** This
1d290 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d2a0 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  led to handle th
1d2b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1d2c0 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c  IZE_HINT .** fil
1d2d0 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74  e-control operat
1d2e0 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ion.  Enlarge th
1d2f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42  e database to nB
1d300 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20  ytes in size.** 
1d310 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74  (rounded up to t
1d320 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69  he next chunk-si
1d330 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74  ze).  If the dat
1d340 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1d350 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61  .** nBytes or la
1d360 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69  rger, this routi
1d370 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1d380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1d390 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1d3a0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1d3b0 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1d3c0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1d3d0 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1d400 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1d410 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1d420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d430 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1d440 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1d450 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1d460 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1d470 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1d480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1d490 4f 45 52 52 5f 46 53 54 41 54 3b 0a 0a 20 20 20  OERR_FSTAT;..   
1d4a0 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1d4b0 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1d4c0 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1d4d0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d4e0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1d4f0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1d500 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1d510 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1d520 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1d530 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1d540 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1d550 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1d560 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1d570 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1d580 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1d590 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1d5a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1d5b0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1d5c0 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1d5d0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1d5e0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1d5f0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1d600 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1d610 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1d620 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1d630 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1d640 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1d650 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1d660 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1d670 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1d680 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1d690 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1d6a0 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1d6b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1d6c0 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1d6d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1d6e0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1d6f0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1d700 29 2c 20 66 61 6b 65 20 69 74 2e 20 46 69 72 73  ), fake it. Firs
1d710 74 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  t use.      ** f
1d720 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 73 65  truncate() to se
1d730 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1d740 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 73 69   then write a si
1d750 6e 67 6c 65 20 62 79 74 65 20 74 6f 0a 20 20 20  ngle byte to.   
1d760 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 62     ** the last b
1d770 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  yte in each bloc
1d780 6b 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  k within the ext
1d790 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1d7a0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
1d7b0 68 65 20 73 61 6d 65 20 74 65 63 68 6e 69 71 75  he same techniqu
1d7c0 65 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  e used by glibc 
1d7d0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 70 6f 73  to implement pos
1d7e0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 0a 20  ix_fallocate(). 
1d7f0 20 20 20 20 20 2a 2a 20 6f 6e 20 73 79 73 74 65       ** on syste
1d800 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ms that do not h
1d810 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1d820 63 61 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  cate() system ca
1d830 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ll..      */.   
1d840 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75     int nBlk = bu
1d850 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f  f.st_blksize;  /
1d860 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c  * File-system bl
1d870 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ock size */.    
1d880 20 20 69 36 34 20 69 57 72 69 74 65 3b 20 20 20    i64 iWrite;   
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d8a0 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20   Next offset to 
1d8b0 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20  write to */..   
1d8c0 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1d8d0 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1d8e0 2c 20 6e 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  , nSize) ){.    
1d8f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1d900 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1d910 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
1d920 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1d930 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
1d940 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
1d950 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1d960 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
1d970 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
1d980 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
1d990 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
1d9a0 20 20 20 20 77 68 69 6c 65 28 20 69 57 72 69 74      while( iWrit
1d9b0 65 3c 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  e<nSize ){.     
1d9c0 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
1d9d0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1d9e0 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1d9f0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1da00 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1da10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1da20 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20 20 69  WRITE;.        i
1da30 57 72 69 74 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20  Write += nBlk;. 
1da40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1da50 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1da60 46 69 6c 65 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3e  File->mmapLimit>
1da70 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  0 ){.    int rc;
1da80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1da90 36 34 20 6e 53 7a 20 3d 20 6e 42 79 74 65 3b 0a  64 nSz = nByte;.
1daa0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
1dab0 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20  zChunk<=0 ){.   
1dac0 20 20 20 6e 53 7a 20 3d 20 28 28 6e 53 7a 2b 70     nSz = ((nSz+p
1dad0 46 69 6c 65 2d 3e 73 7a 53 79 73 70 61 67 65 2d  File->szSyspage-
1dae0 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 53 79  1) / pFile->szSy
1daf0 73 70 61 67 65 29 20 2a 20 70 46 69 6c 65 2d 3e  spage) * pFile->
1db00 73 7a 53 79 73 70 61 67 65 3b 0a 20 20 20 20 20  szSyspage;.     
1db10 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1db20 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1db30 6e 53 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nSz) ){.        
1db40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1db50 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
1db60 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1db70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1db80 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
1db90 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
1dba0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
1dbb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1dbc0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1dbd0 6c 65 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 72 65  le, nSz);.    re
1dbe0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1dbf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dc00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1dc10 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
1dc20 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
1dc30 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
1dc40 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
1dc50 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
1dc60 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
1dc70 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
1dc80 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1dc90 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
1dca0 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
1dcb0 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
1dcc0 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
1dcd0 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
1dce0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
1dcf0 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
1dd00 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
1dd10 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
1dd20 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
1dd30 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
1dd40 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
1dd50 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
1dd60 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
1dd70 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
1dd80 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
1dd90 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1dda0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
1ddb0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1ddc0 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
1ddd0 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
1dde0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
1ddf0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1de00 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
1de10 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
1de20 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
1de30 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
1de40 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
1de50 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
1de60 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1de70 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
1de80 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
1de90 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1dea0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1deb0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1dec0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1ded0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1dee0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
1def0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
1df00 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1df10 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
1df20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1df30 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1df40 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
1df50 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1df60 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1df70 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1df80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1df90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1dfa0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1dfb0 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1dfc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1dfd0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1dfe0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1dff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e000 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e010 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e020 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e030 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e040 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e050 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e060 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e070 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e080 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e090 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1e0a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e0b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1e0c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1e0d0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1e0e0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e0f0 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e100 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1e110 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e140 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1e150 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e160 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1e170 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e180 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1e190 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e1b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e1c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1e1d0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1e1e0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1e1f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e200 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1e210 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e240 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1e250 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1e260 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1e270 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e280 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  c( pFile->pVfs->
1e290 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
1e2a0 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
1e2b0 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
1e2c0 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
1e2d0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1e2e0 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
1e2f0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1e300 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
1e310 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1e320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e330 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e340 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
1e350 49 54 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  IT: {.      pFil
1e360 65 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20 3d 20 2a  e->mmapLimit = *
1e370 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
1e380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e390 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  OK;.    }.#ifdef
1e3a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1e3b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
1e3c0 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64  alls this method
1e3d0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20   to signal that 
1e3e0 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20  it has done.    
1e3f0 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ** a rollback an
1e400 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
1e410 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65  ase is therefore
1e420 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20   unchanged and. 
1e430 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69     ** it hence i
1e440 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1e450 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e  transaction chan
1e460 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65  ge counter to be
1e470 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65  .    ** unchange
1e480 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
1e490 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e4a0 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a  DB_UNCHANGED: {.
1e4b0 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
1e4c0 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20  *)id)->dbUpdate 
1e4d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1e4e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e4f0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   }.#endif.#if SQ
1e500 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e510 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1e520 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1e530 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e540 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1e550 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1e560 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
1e570 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1e580 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1e590 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1e5a0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1e5b0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1e5c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1e5d0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1e5e0 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
1e5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1e600 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1e610 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1e620 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1e630 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1e640 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1e650 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1e660 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1e670 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1e680 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1e690 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1e6a0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1e6b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1e6c0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1e6d0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1e6e0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1e6f0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1e700 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1e710 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1e720 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1e730 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1e740 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1e750 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1e760 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1e770 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1e780 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1e790 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  both..*/.#ifndef
1e7a0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61   __QNXNTO__ .sta
1e7b0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1e7c0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1e7d0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1e7e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e7f0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1e800 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1e810 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1e820 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e830 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1e840 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65  ersion of unixSe
1e850 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70  ctorSize() is op
1e860 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e  timized for QNX.
1e870 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58  .*/.#ifdef __QNX
1e880 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c  NTO__.#include <
1e890 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a  sys/dcmd_blk.h>.
1e8a0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
1e8b0 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20  atvfs.h>.static 
1e8c0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1e8d0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1e8e0 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
1e8f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1e900 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
1e910 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1e920 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72   == 0 ){.    str
1e930 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e  uct statvfs fsIn
1e940 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20  fo;.       .    
1e950 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20  /* Set defaults 
1e960 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65  for non-supporte
1e970 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f  d filesystems */
1e980 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
1e990 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
1e9a0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1e9b0 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  IZE;.    pFile->
1e9c0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1e9d0 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69  stics = 0;.    i
1e9e0 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c  f( fstatvfs(pFil
1e9f0 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  e->h, &fsInfo) =
1ea00 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72  = -1 ) {.      r
1ea10 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1ea20 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  torSize;.    }..
1ea30 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
1ea40 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1ea50 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20  e, "tmp") ) {.  
1ea60 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1ea70 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1ea80 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1ea90 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1eaa0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1eab0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1eac0 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20  P_ATOMIC4K |    
1ead0 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69     /* All ram fi
1eae0 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
1eaf0 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1eb00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1eb10 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1eb20 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1eb30 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1eb40 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1eb80 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1eb90 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1eba0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1ebb0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1ebc0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1ebd0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1ec10 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1ec20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1ec30 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
1ec40 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66  f_basetype, "etf
1ec50 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1ec60 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1ec70 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1ec80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1ec90 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1eca0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1ecb0 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69   etfs cluster si
1ecc0 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74  ze writes are at
1ecd0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1ece0 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1ecf0 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1ed00 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1ed10 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  2) |.        SQL
1ed20 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1ed30 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1ed40 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1ed50 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1ed60 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1ed90 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1eda0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1edb0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1edc0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1edd0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1ede0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1edf0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1ee20 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1ee30 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1ee40 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
1ee50 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1ee60 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20  pe, "qnx6") ){. 
1ee70 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1ee80 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1ee90 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1eea0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1eeb0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1eec0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1eed0 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20  AP_ATOMIC |     
1eee0 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
1eef0 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1ef00 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1ef10 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1ef20 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1ef30 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1ef40 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1ef50 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1ef90 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1efa0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1efb0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1efc0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1efd0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1efe0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f010 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f020 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f030 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
1f040 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1f050 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22  basetype, "qnx4"
1f060 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f070 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f080 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f090 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f0a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f0b0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1f0c0 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1f0d0 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1f0e0 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1f0f0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1f100 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1f110 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1f120 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f130 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1f140 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1f150 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f160 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f170 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f180 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f190 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f1c0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f1d0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f1e0 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
1f1f0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f200 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20  , "dos") ){.    
1f210 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f220 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f230 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f240 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f250 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f260 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
1f270 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
1f280 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
1f290 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
1f2a0 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
1f2b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1f2c0 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1f2d0 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
1f2e0 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
1f2f0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f300 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f310 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f320 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f330 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f360 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f370 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f390 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f3a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f3b0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f3c0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20  IOCAP_ATOMIC512 
1f3d0 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73  |      /* blocks
1f3e0 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1f3f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f400 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1f410 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1f420 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1f430 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1f470 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1f480 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20       0;.    }.  
1f490 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e  }.  /* Last chan
1f4a0 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  ce verification.
1f4b0 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20    If the sector 
1f4c0 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c  size isn't a mul
1f4d0 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a  tiple of 512.  *
1f4e0 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20  * then it isn't 
1f4f0 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70  valid.*/.  if( p
1f500 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f510 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20   % 512 != 0 ){. 
1f520 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1f530 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f540 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1f550 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1f560 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1f570 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
1f580 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1f590 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  torSize;.}.#endi
1f5a0 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  f /* __QNXNTO__ 
1f5b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
1f5c0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1f5d0 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
1f5e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
1f5f0 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
1f600 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
1f610 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1f620 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
1f630 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
1f640 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
1f650 65 20 69 73 20 63 6f 6e 74 72 61 76 65 72 73 69  e is contraversi
1f660 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
1f670 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
1f680 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
1f690 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
1f6a0 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
1f6b0 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
1f6c0 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
1f6d0 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
1f6e0 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
1f6f0 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
1f700 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
1f710 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
1f720 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1f730 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
1f740 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
1f750 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
1f760 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
1f770 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
1f780 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
1f790 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
1f7a0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
1f7b0 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
1f7c0 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
1f7d0 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
1f7e0 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
1f7f0 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
1f800 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1f810 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
1f820 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
1f830 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
1f840 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
1f850 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
1f860 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
1f870 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
1f880 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
1f890 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
1f8a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f8b0 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
1f8c0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
1f8d0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
1f8e0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
1f8f0 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e  = 0;.#ifdef __QN
1f900 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e  XNTO__.  if( p->
1f910 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20  sectorSize==0 ) 
1f920 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69  unixSectorSize(i
1f930 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65  d);.  rc = p->de
1f940 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f950 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ics;.#endif.  if
1f960 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ( p->ctrlFlags &
1f970 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
1f980 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49  {.    rc |= SQLI
1f990 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1f9a0 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
1f9b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f9c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1f9d0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a  _OMIT_WAL.../*.*
1f9e0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1f9f0 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
1fa00 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
1fa10 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
1fa20 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1fa30 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
1fa40 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
1fa50 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
1fa60 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
1fa70 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
1fa80 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
1fa90 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1faa0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
1fab0 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
1fac0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
1fad0 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
1fae0 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
1faf0 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
1fb00 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1fb10 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
1fb20 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
1fb30 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
1fb40 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
1fb50 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
1fb60 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
1fb70 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
1fb80 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
1fb90 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
1fba0 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
1fbb0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1fbc0 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
1fbd0 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
1fbe0 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
1fbf0 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
1fc00 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
1fc10 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
1fc20 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
1fc30 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
1fc40 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
1fc50 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1fc60 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
1fc70 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
1fc80 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
1fc90 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1fca0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
1fcb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
1fcc0 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1fcd0 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
1fce0 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
1fcf0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
1fd00 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
1fd10 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
1fd20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1fd30 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
1fd40 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
1fd50 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1fd60 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1fd70 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1fd80 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
1fd90 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1fda0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1fdb0 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
1fdc0 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
1fdd0 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
1fde0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1fdf0 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
1fe00 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1fe10 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1fe20 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1fe30 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1fe40 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1fe50 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
1fe60 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
1fe70 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
1fe80 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
1fe90 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
1fea0 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
1feb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
1fec0 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
1fed0 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
1fee0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
1fef0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
1ff00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ff10 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
1ff20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
1ff50 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
1ff60 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff80 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
1ff90 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
1ffa0 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffc0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
1ffd0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
1ffe0 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
1fff0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20000 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
20010 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f    char **apRegio
20020 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
20030 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20  Array of mapped 
20040 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20050 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
20060 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
20070 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20080 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  of unixShm objec
20090 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
200a0 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
200b0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
200c0 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53      /* All unixS
200d0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
200e0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23  ing to this */.#
200f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20100 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
20110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20120 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
20130 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
20140 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
20150 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20160 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
20170 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
20180 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201a0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
201b0 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
201c0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
201d0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
201e0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
201f0 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
20200 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
20210 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
20220 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
20230 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
20240 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
20250 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
20260 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
20270 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
20280 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
20290 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
202a0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70  .**    unixShm.p
202b0 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53  File.**    unixS
202c0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
202d0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
202e0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
202f0 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d  e unixShm.pFile-
20300 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
20310 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
20320 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
20330 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
20340 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20  .struct unixShm 
20350 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
20360 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f  *pShmNode;     /
20370 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
20380 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20390 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ect */.  unixShm
203a0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
203b0 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78      /* Next unix
203c0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
203d0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  e unixShmNode */
203e0 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20400 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
20410 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
20420 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69   mutex */.  u8 i
20430 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
20440 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
20450 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
20460 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53  within its unixS
20470 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  hmNode */.  u16 
20480 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
20490 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
204a0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
204b0 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
204c0 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
204d0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
204e0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
204f0 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  eld */.};../*.**
20500 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
20510 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
20520 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
20530 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
20540 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
20550 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73           /* firs
20560 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
20570 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f  define UNIX_SHM_
20580 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d  DMS    (UNIX_SHM
20590 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
205a0 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
205b0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
205c0 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
205d0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
205e0 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72  for all bytes fr
205f0 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20  om ofst through 
20600 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20  ofst+n-1..**.** 
20610 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74  Locks block if t
20620 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74  he mask is exact
20630 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e  ly UNIX_SHM_C an
20640 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69  d are non-blocki
20650 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ng.** otherwise.
20660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
20670 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
20680 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  (.  unixShmNode 
20690 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70  *pShmNode, /* Ap
206a0 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
206b0 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
206c0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
206d0 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
206e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
206f0 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
20700 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
20710 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
20720 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
20730 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
20740 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
20750 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
20760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20770 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
20780 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
20790 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
207a0 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
207b0 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
207c0 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ture */.  int rc
207d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
207e0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
207f0 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
20800 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
20810 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
20820 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
20830 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
20840 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
20850 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20860 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
20870 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
20880 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
20890 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
208a0 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
208b0 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
208c0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
208d0 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
208e0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
208f0 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
20900 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
20910 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
20920 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
20930 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
20940 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  >=0 ){.    /* In
20950 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
20960 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
20970 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
20980 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
20990 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
209a0 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
209b0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
209c0 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
209d0 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
209e0 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
209f0 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
20a00 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54  hmNode->h, F_SET
20a10 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20  LK, &f);.    rc 
20a20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
20a30 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
20a40 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
20a50 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
20a60 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
20a70 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
20a80 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
20a90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
20aa0 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
20ab0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
20ac0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  );.  mask = (1<<
20ad0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
20ae0 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
20af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20b00 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
20b10 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
20b20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
20b30 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
20b40 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
20b50 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
20b60 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
20b70 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
20b80 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
20b90 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
20ba0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
20bb0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
20bc0 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
20bd0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
20be0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
20bf0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
20c00 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
20c10 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
20c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
20c30 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
20c40 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
20c50 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
20c60 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
20c70 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
20c80 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
20c90 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
20ca0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
20cb0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
20cc0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20cd0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
20ce0 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
20cf0 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
20d00 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
20d10 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
20d20 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
20d30 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
20d40 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
20d50 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
20d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
20d70 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
20d80 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
20d90 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
20da0 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
20db0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
20dc0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
20dd0 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
20de0 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
20df0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
20e00 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
20e10 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
20e20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
20e30 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
20e40 20 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 75     .}.../*.** Pu
20e50 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
20e60 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
20e70 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
20e80 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
20e90 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
20ea0 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
20eb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
20ec0 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
20ed0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
20ee0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
20ef0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
20f00 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
20f10 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
20f20 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
20f30 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
20f40 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
20f50 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
20f60 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
20f70 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
20f80 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
20f90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
20fa0 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
20fb0 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
20fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
20fd0 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
20fe0 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
20ff0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
21000 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21010 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
21020 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70    osMunmap(p->ap
21030 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
21040 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
21050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21060 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
21070 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
21080 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
21090 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
210a0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
210b0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
210c0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
210d0 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
210e0 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
210f0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
21100 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
21110 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
21120 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
21130 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
21140 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
21150 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
21160 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
21170 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
21180 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
21190 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
211a0 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
211b0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
211c0 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
211d0 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
211e0 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
211f0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
21200 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
21210 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
21220 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
21230 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
21240 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
21250 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
21260 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
21270 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
21280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
21290 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
212a0 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
212b0 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
212c0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
212d0 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
212e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
212f0 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
21300 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
21310 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
21320 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
21330 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
21340 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
21350 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
21360 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
21370 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
21380 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
21390 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
213a0 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
213b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
213c0 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
213d0 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
213e0 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
213f0 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
21400 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
21410 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
21420 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
21430 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
21440 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
21450 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
21460 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
21470 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
21480 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
21490 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
214a0 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
214b0 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
214c0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
214d0 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
214e0 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
214f0 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
21500 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
21510 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
21520 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
21530 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
21540 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
21550 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
21560 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
21570 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
21580 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
21590 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
215a0 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
215b0 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
215c0 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
215d0 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
215e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
215f0 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
21600 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
21610 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
21620 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
21630 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
21640 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
21650 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
21660 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
21670 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
21680 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
21690 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
216a0 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
216b0 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
216c0 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
216d0 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
216e0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
216f0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
21700 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
21710 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
21720 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
21730 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
21740 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
21750 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
21760 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
21770 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
21780 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
21790 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
217a0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
217b0 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
217c0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
217d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
217e0 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
217f0 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
21800 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
21810 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
21820 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
21830 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
21840 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
21850 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
21860 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
21870 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
21880 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
21890 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
218a0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
218b0 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
218c0 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
218d0 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
218e0 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
218f0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
21900 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
21910 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
21920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
21930 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
21940 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
21950 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
21960 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
21970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
21980 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
21990 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
219a0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
219b0 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
219c0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
219d0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
219e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a00 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
21a10 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
21a20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
21a30 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
21a40 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
21a50 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
21a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21a70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
21a80 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
21a90 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
21aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21ab0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
21ac0 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
21ad0 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
21ae0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
21af0 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
21b00 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
21b10 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
21b20 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
21b30 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
21b40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21b50 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
21b60 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
21b70 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
21b80 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
21b90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
21ba0 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
21bb0 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
21bc0 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
21bd0 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
21be0 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
21bf0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
21c00 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
21c10 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
21c20 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
21c30 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
21c40 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
21c50 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
21c60 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
21c70 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
21c80 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
21c90 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
21ca0 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
21cb0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
21cc0 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
21cd0 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
21ce0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
21cf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21d00 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
21d10 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
21d20 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
21d30 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
21d40 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
21d50 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
21d60 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
21d70 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
21d80 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
21d90 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26  d->h, &sStat) &&
21da0 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
21db0 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
21dc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
21dd0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
21de0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
21df0 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
21e00 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
21e10 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
21e20 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
21e30 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
21e40 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c  CTORY) + 31;.#el
21e50 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
21e60 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73  ame = 6 + (int)s
21e70 74 72 6c 65 6e 28 70 44 62 46 64 2d 3e 7a 50 61  trlen(pDbFd->zPa
21e80 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
21e90 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
21ea0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
21eb0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
21ec0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ShmFilename );. 
21ed0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d     if( pShmNode=
21ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21ef0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21f00 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
21f10 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
21f20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
21f30 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
21f40 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65  hmNode)+nShmFile
21f50 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46  name);.    zShmF
21f60 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f  ilename = pShmNo
21f70 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  de->zFilename = 
21f80 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65  (char*)&pShmNode
21f90 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
21fa0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
21fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
21fc0 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
21fd0 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
21fe0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
21ff0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
22000 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73  HM_DIRECTORY "/s
22010 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22  qlite-shm-%x-%x"
22020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22030 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61         (u32)sSta
22040 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73  t.st_ino, (u32)s
22050 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65  Stat.st_dev);.#e
22060 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lse.    sqlite3_
22070 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
22080 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
22090 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70  ame, "%s-shm", p
220a0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
220b0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
220c0 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
220d0 68 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  h, zShmFilename)
220e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
220f0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  mNode->h = -1;. 
22100 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65     pDbFd->pInode
22110 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
22120 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  mNode;.    pShmN
22130 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44  ode->pInode = pD
22140 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20  bFd->pInode;.   
22150 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
22160 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
22170 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
22180 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
22190 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
221a0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
221b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
221c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
221d0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
221e0 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
221f0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
22200 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
22210 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
22220 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20  R | O_CREAT;.   
22230 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
22240 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64  ri_boolean(pDbFd
22250 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e  ->zPath, "readon
22260 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20  ly_shm", 0) ){. 
22270 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
22280 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20   = O_RDONLY;.   
22290 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
222a0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
222b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
222c0 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
222d0 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e  t_open(zShmFilen
222e0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
222f0 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30  (sStat.st_mode&0
22300 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28  777));.      if(
22310 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
22320 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
22330 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
22340 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
22350 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69  , "open", zShmFi
22360 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
22370 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
22380 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rr;.      }..   
22390 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72     /* If this pr
223a0 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67  ocess is running
223b0 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73   as root, make s
223c0 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48 4d  ure that the SHM
223d0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69   file.      ** i
223e0 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73  s owned by the s
223f0 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f 77  ame user that ow
22400 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ns the original 
22410 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72  database.  Other
22420 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  wise,.      ** t
22430 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65  he original owne
22440 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  r will not be ab
22450 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20  le to connect.. 
22460 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6f 73       */.      os
22470 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d  Fchown(pShmNode-
22480 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64  >h, sStat.st_uid
22490 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b  , sStat.st_gid);
224a0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  .  .      /* Che
224b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
224c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
224d0 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
224e0 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
224f0 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
22500 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
22510 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
22520 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22540 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68        if( unixSh
22550 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
22560 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55  Node, F_WRLCK, U
22570 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  NIX_SHM_DMS, 1)=
22580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22590 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
225a0 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e  _ftruncate(pShmN
225b0 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20  ode->h, 0) ){.  
225c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
225d0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
225e0 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20  _IOERR_SHMOPEN, 
225f0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a 53 68  "ftruncate", zSh
22600 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  mFilename);.    
22610 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22640 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
22650 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
22660 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f  , F_RDLCK, UNIX_
22670 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
22680 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
22690 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65  c ) goto shm_ope
226a0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  n_err;.    }.  }
226b0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
226c0 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
226d0 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e   child of the un
226e0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  ixShmNode */.  p
226f0 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
22700 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
22710 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
22720 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
22730 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
22740 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
22750 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
22760 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78  pShm = p;.  unix
22770 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
22780 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
22790 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
227a0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
227b0 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
227c0 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
227d0 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69  cover of the uni
227e0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  xEnterMutex() mu
227f0 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
22800 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
22810 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e  * new (struct un
22820 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  ixShm) object to
22830 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
22840 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
22850 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
22860 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
22870 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
22880 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
22890 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
228a0 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
228b0 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
228c0 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
228d0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
228e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
228f0 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
22900 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22910 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
22920 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
22930 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
22940 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
22950 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
22960 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
22970 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
22980 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
22990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
229a0 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
229b0 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
229c0 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53  pen_err:.  unixS
229d0 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20  hmPurge(pDbFd); 
229e0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
229f0 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
22a00 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
22a10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
22a20 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  p);.  unixLeaveM
22a30 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
22a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22a50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22a60 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
22a70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
22a80 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
22a90 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
22aa0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
22ab0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
22ac0 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
22ad0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
22ae0 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
22af0 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
22b00 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
22b10 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
22b20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
22b30 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
22b40 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
22b50 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
22b60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
22b70 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
22b80 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
22b90 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
22ba0 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d  he bExtend param
22bb0 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
22bc0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
22bd0 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
22be0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
22bf0 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
22c00 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
22c10 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
22c20 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
22c30 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
22c40 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
22c50 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
22c60 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
22c70 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f  ** bExtend is no
22c80 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
22c90 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
22ca0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
22cb0 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
22cc0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
22cd0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
22ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
22cf0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
22d00 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
22d10 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
22d20 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
22d30 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
22d40 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
22d50 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
22d60 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
22d70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
22d80 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
22d90 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
22da0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
22db0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
22dc0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
22dd0 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
22de0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
22df0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
22e00 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a  int unixShmMap(.
22e10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22e20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
22e30 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
22e40 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
22e50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
22e60 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
22e70 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
22e80 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
22e90 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
22ec0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45  ions */.  int bE
22ed0 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20  xtend,          
22ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22ef0 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
22f00 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
22f10 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
22f20 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
22f30 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
22f40 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
22f50 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
22f60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
22f70 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a  ;.  unixShm *p;.
22f80 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
22f90 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
22fa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22fb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72    /* If the shar
22fc0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68  ed-memory file h
22fd0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
22fe0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
22ff0 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44  now. */.  if( pD
23000 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a  bFd->pShm==0 ){.
23010 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65      rc = unixOpe
23020 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
23030 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
23040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
23050 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
23060 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
23070 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
23080 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c  >pShmNode;.  sql
23090 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
230a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
230b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
230c0 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
230d0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
230e0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
230f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
23100 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d  ShmNode->pInode=
23110 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29  =pDbFd->pInode )
23120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23130 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
23140 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
23150 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
23160 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
23170 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
23180 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
23190 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
231a0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
231b0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
231c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e  {.    char **apN
231d0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
231e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
231f0 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79  apRegion[] array
23200 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
23210 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
23220 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
23230 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
23240 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
23250 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
23260 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23270 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73     /* Used by fs
23280 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53  tat() */..    pS
23290 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
232a0 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20   = szRegion;..  
232b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
232c0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  h>=0 ){.      /*
232d0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
232e0 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
232f0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
23300 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
23310 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20  space..      ** 
23320 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23330 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
23340 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
23350 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
23360 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61  e is.      ** la
23370 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  rge enough to co
23380 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73  ntain the reques
23390 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20  ted region)..   
233a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
233b0 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65  osFstat(pShmNode
233c0 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
233d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
233e0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
233f0 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  E;.        goto 
23400 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
23410 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
23420 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c  ( sStat.st_size<
23430 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
23440 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
23450 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
23460 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
23470 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65  If bExtend is se
23480 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
23490 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c  false, exit earl
234a0 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
234b0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
234c0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
234d0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
234e0 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61        ** Alterna
234f0 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
23500 6e 64 20 69 73 20 74 72 75 65 2c 20 75 73 65 20  nd is true, use 
23510 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
23520 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 20 20  llocate.        
23530 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
23540 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
23550 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23560 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20     if( !bExtend 
23570 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
23580 75 74 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ut;.#if defined(
23590 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
235a0 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f  CATE) && HAVE_PO
235b0 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20  SIX_FALLOCATE.  
235c0 20 20 20 20 20 20 69 66 28 20 6f 73 46 61 6c 6c        if( osFall
235d0 6f 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ocate(pShmNode->
235e0 68 2c 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  h, sStat.st_size
235f0 2c 20 6e 42 79 74 65 29 21 3d 30 20 29 7b 0a 20  , nByte)!=0 ){. 
23600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
23610 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
23620 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
23630 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 0a 20 20   "fallocate",.  
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
23660 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
23670 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
23680 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
23690 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
236a0 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66      if( robust_f
236b0 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
236c0 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a  e->h, nByte) ){.
236d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
236e0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
236f0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
23700 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 0a 20  , "ftruncate",. 
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
23730 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
23740 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23750 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
23760 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
23770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23780 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
23790 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
237a0 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
237b0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
237c0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
237d0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  New = (char **)s
237e0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
237f0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
23800 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 28 69 52 65  ->apRegion, (iRe
23810 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 63  gion+1)*sizeof(c
23820 68 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20  har *).    );.  
23830 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
23840 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23850 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
23860 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
23870 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
23880 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
23890 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  ion = apNew;.   
238a0 20 77 68 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d   while(pShmNode-
238b0 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
238c0 6e 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  n){.      void *
238d0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
238e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
238f0 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
23900 20 6f 73 4d 6d 61 70 28 30 2c 20 73 7a 52 65 67   osMmap(0, szReg
23910 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
23920 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
23930 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41  donly ? PROT_REA
23940 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  D : PROT_READ|PR
23950 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20  OT_WRITE, .     
23960 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45         MAP_SHARE
23970 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  D, pShmNode->h, 
23980 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53  szRegion*(i64)pS
23990 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a  hmNode->nRegion.
239a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
239b0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
239c0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
239d0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
239e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
239f0 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
23a00 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
23a10 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
23a20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23a30 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
23a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23a50 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
23a60 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52 65 67  te3_malloc(szReg
23a70 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
23a80 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
23a90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23aa0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23ab0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
23ac0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
23ad0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
23ae0 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  Mem, 0, szRegion
23af0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23b00 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
23b10 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
23b20 65 67 69 6f 6e 5d 20 3d 20 70 4d 65 6d 3b 0a 20  egion] = pMem;. 
23b30 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
23b40 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
23b50 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
23b60 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
23b70 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
23b80 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
23b90 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
23ba0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
23bb0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
23bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
23bd0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
23be0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
23bf0 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
23c00 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
23c10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
23c20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
23c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23c40 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
23c50 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
23c60 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
23c70 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
23c80 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
23c90 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
23ca0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
23cb0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
23cc0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
23cd0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
23ce0 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
23cf0 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
23d00 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
23d10 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
23d20 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
23d30 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
23d40 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
23d50 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
23d60 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
23d70 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
23d80 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
23d90 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
23da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
23db0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
23dc0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
23dd0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
23de0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
23df0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
23e00 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
23e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23e20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
23e30 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
23e40 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
23e50 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
23e60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23e70 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
23e80 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
23e90 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
23ec0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
23ed0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
23ee0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
23ef0 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
23f00 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
23f10 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
23f20 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
23f30 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
23f40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23f50 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
23f60 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
23f70 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
23fa0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
23fb0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
23fc0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
23fd0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
23fe0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
23ff0 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
24000 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
24010 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
24020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
24030 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
24040 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
24070 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
24080 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
24090 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
240a0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
240b0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
240c0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
240d0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
240e0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
240f0 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
24100 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
24110 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
24120 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
24130 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
24140 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
24150 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
24160 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
24170 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
24180 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
24190 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
241a0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
241b0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
241c0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
241d0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
241e0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
241f0 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
24200 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
24210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
24220 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
24230 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
24240 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
24250 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
24260 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
24270 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
24280 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
24290 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
242a0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
242b0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
242c0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
242d0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
242e0 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
242f0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
24300 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
24310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
24320 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
24330 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
24340 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
24350 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
24360 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
24370 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
24380 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
24390 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
243a0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
243b0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
243c0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
243d0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
243e0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
243f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
24400 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
24410 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
24420 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
24430 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
24440 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
24450 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
24460 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
24470 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
24480 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
24490 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
244a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
244b0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
244c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
244d0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
244e0 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43  pShmNode, F_UNLC
244f0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
24500 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
24510 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
24520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24530 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
24540 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
24550 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
24560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24570 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
24580 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
24590 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
245a0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
245b0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
245c0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
245d0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
245e0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
245f0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
24600 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
24610 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
24620 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
24630 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
24640 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
24650 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
24660 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
24670 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
24680 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
24690 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
246a0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
246b0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
246c0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
246d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
246e0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
246f0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
24700 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
24710 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
24720 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
24730 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24740 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
24750 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24760 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
24770 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
24780 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
24790 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
247a0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
247b0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
247c0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
247d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
247e0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
247f0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
24800 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
24810 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
24820 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
24830 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
24840 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
24850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24880 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
24890 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
248a0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
248b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
248c0 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
248d0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
248e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
248f0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
24900 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
24910 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
24920 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
24930 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
24940 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
24950 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
24960 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
24970 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
24980 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
24990 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
249a0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
249b0 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
249c0 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
249d0 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
249e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
249f0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
24a00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
24a20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
24a30 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
24a40 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
24a50 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
24a60 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
24a70 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
24a80 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
24a90 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
24aa0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
24ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24ac0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
24ad0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
24ae0 6f 64 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  ode, F_WRLCK, of
24af0 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
24b00 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
24b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24b20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24b30 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
24b40 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
24b50 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
24b60 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
24b70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
24b80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
24b90 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
24ba0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
24bb0 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
24bc0 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
24bd0 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
24be0 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
24bf0 65 74 70 69 64 28 29 2c 20 70 2d 3e 73 68 61 72  etpid(), p->shar
24c00 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
24c10 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
24c20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
24c30 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
24c40 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
24c50 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
24c60 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
24c70 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
24c80 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
24c90 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
24ca0 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
24cb0 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
24cc0 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
24cd0 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
24ce0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
24cf0 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
24d00 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
24d10 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
24d20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24d30 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
24d40 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
24d50 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
24d60 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 75  RAMETER(fd);.  u
24d70 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
24d80 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
24d90 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
24da0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
24db0 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
24dc0 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
24dd0 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
24de0 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
24df0 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
24e00 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
24e10 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
24e20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24e30 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
24e40 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
24e50 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
24e60 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
24e70 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
24e80 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
24e90 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
24ea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
24eb0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
24ec0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
24ed0 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
24ef0 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
24f00 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
24f10 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
24f40 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
24f50 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
24f60 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
24f70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
24f80 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
24f90 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
24fa0 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
24fd0 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
24fe0 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
24ff0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25010 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
25020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25030 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
25040 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
25050 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
25060 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25080 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
25090 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
250a0 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
250b0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
250c0 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
250d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
250e0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
250f0 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
25100 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
25110 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
25120 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
25130 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
25140 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
25150 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
25160 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
25170 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
25180 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
25190 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
251a0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
251b0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
251c0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
251d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
251e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
251f0 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
25200 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
25210 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
25220 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
25230 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
25240 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
25250 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
25260 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
25270 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
25280 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
25290 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
252a0 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
252b0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
252c0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
252d0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
252e0 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
252f0 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
25300 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
25310 3e 68 3e 3d 30 20 29 20 6f 73 55 6e 6c 69 6e 6b  >h>=0 ) osUnlink
25320 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
25330 6e 61 6d 65 29 3b 0a 20 20 20 20 75 6e 69 78 53  name);.    unixS
25340 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a  hmPurge(pDbFd);.
25350 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
25360 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
25370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25380 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
25390 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30  unixShmMap     0
253a0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
253b0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
253c0 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69  ine unixShmBarri
253d0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e  er 0.# define un
253e0 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  ixShmUnmap   0.#
253f0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
25400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
25410 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74   */../*.** If it
25420 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65   is currently me
25430 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d  mory mapped, unm
25440 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a  ap file pFd..*/.
25450 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
25460 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  Unmapfile(unixFi
25470 6c 65 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  le *pFd){.  int 
25480 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  i;.  assert( pFd
25490 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
254a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
254b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 69 78  ; i++){.    unix
254c0 4d 61 70 70 69 6e 67 20 2a 70 4d 61 70 20 3d 20  Mapping *pMap = 
254d0 26 70 46 64 2d 3e 61 4d 6d 61 70 5b 69 5d 3b 0a  &pFd->aMmap[i];.
254e0 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 70 4d      if( pMap->pM
254f0 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
25500 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4d 61 70 2d    osMunmap(pMap-
25510 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 4d 61  >pMapRegion, pMa
25520 70 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65 29  p->mmapOrigsize)
25530 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 70 4d  ;.      pMap->pM
25540 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
25550 20 20 20 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69      pMap->mmapSi
25560 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  ze = 0;.      pM
25570 61 70 2d 3e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  ap->mmapOrigsize
25580 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
25590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
255a0 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
255b0 73 69 7a 65 20 73 6f 6d 65 68 6f 77 2e 0a 2a 2f  size somehow..*/
255c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
255d0 47 65 74 50 61 67 65 73 69 7a 65 28 76 6f 69 64  GetPagesize(void
255e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 34 30 39 36  ){.  return 4096
255f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
25600 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
25610 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
25620 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
25630 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
25640 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
25650 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
25660 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
25670 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
25680 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
25690 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
256a0 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
256b0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
256c0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
256d0 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
256e0 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
256f0 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
25700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25710 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
25720 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
25730 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
25740 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
25750 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
25760 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
25770 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
25780 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
25790 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
257a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
257b0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
257c0 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
257d0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
257e0 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
257f0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
25800 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
25810 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
25820 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
25830 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
25840 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
25850 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49  TE_FCNTL_MMAP_LI
25860 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69  MIT, whichever i
25870 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
25880 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25890 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
258a0 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
258b0 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
258c0 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
258d0 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
258e0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
258f0 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
25900 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
25910 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
25920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
25930 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
25940 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
25950 74 65 29 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20  te){.  i64 nMap 
25960 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72  = nByte;.  int r
25970 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  c;..  assert( nM
25980 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
25990 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
259a0 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
259b0 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
259c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
259d0 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74  nMap<0 ){.    st
259e0 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
259f0 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  f;          /* L
25a00 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
25a10 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
25a20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46   rc = osFstat(pF
25a30 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 3b  d->h, &statbuf);
25a40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25a70 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
25a80 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74  .    nMap = stat
25a90 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d  buf.st_size;.  }
25aa0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
25ab0 3e 6d 6d 61 70 4c 69 6d 69 74 20 29 7b 0a 20 20  >mmapLimit ){.  
25ac0 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
25ad0 61 70 4c 69 6d 69 74 3b 0a 20 20 7d 0a 0a 20 20  apLimit;.  }..  
25ae0 69 66 28 20 6e 4d 61 70 21 3d 28 70 46 64 2d 3e  if( nMap!=(pFd->
25af0 61 4d 6d 61 70 5b 30 5d 2e 6d 6d 61 70 53 69 7a  aMmap[0].mmapSiz
25b00 65 20 2b 20 70 46 64 2d 3e 61 4d 6d 61 70 5b 31  e + pFd->aMmap[1
25b10 5d 2e 6d 6d 61 70 53 69 7a 65 29 20 29 7b 0a 20  ].mmapSize) ){. 
25b20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
25b30 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
25b40 65 20 72 65 71 75 65 73 74 20 69 73 20 66 6f 72  e request is for
25b50 20 61 20 6d 61 70 70 69 6e 67 20 7a 65 72 6f 20   a mapping zero 
25b60 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6f  bytes in size, o
25b70 72 20 74 68 65 72 65 20 61 72 65 20 0a 20 20 20  r there are .   
25b80 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 6c   ** currently al
25b90 72 65 61 64 79 20 74 77 6f 20 6d 61 70 70 69 6e  ready two mappin
25ba0 67 20 72 65 67 69 6f 6e 73 2c 20 6f 72 20 74 68  g regions, or th
25bb0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
25bc0 20 6d 61 70 70 69 6e 67 0a 20 20 20 20 2a 2a 20   mapping.    ** 
25bd0 72 65 67 69 6f 6e 20 74 68 61 74 20 69 73 20 6e  region that is n
25be0 6f 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ot a multiple of
25bf0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
25c00 6e 20 73 69 7a 65 2c 20 75 6e 6d 61 70 0a 20 20  n size, unmap.  
25c10 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 2e    ** everything.
25c20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61    */.    if( nMa
25c30 70 3d 3d 30 20 0a 23 69 66 20 21 48 41 56 45 5f  p==0 .#if !HAVE_
25c40 4d 52 45 4d 41 50 0a 20 20 20 20 20 7c 7c 20 28  MREMAP.     || (
25c50 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 70 4d  pFd->aMmap[0].pM
25c60 61 70 52 65 67 69 6f 6e 20 26 26 20 70 46 64 2d  apRegion && pFd-
25c70 3e 61 4d 6d 61 70 5b 31 5d 2e 70 4d 61 70 52 65  >aMmap[1].pMapRe
25c80 67 69 6f 6e 29 20 0a 20 20 20 20 20 7c 7c 20 28  gion) .     || (
25c90 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 6d 6d  pFd->aMmap[0].mm
25ca0 61 70 53 69 7a 65 20 25 20 70 46 64 2d 3e 73 7a  apSize % pFd->sz
25cb0 53 79 73 70 61 67 65 29 0a 23 65 6e 64 69 66 0a  Syspage).#endif.
25cc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 75 6e 69      ){.      uni
25cd0 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
25ce0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25cf0 74 28 20 70 46 64 2d 3e 61 4d 6d 61 70 5b 31 5d  t( pFd->aMmap[1]
25d00 2e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  .pMapRegion==0 )
25d10 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e  ;..    if( nMap>
25d20 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
25d30 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
25d40 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 64  ;.      if( (pFd
25d50 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
25d60 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
25d70 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f  0 ) flags |= PRO
25d80 54 5f 57 52 49 54 45 3b 0a 0a 20 20 20 20 20 20  T_WRITE;..      
25d90 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
25da0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 20 6d 61 70  currently no map
25db0 70 69 6e 67 73 2c 20 63 72 65 61 74 65 20 61 20  pings, create a 
25dc0 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20  new one */.     
25dd0 20 69 66 28 20 70 46 64 2d 3e 61 4d 6d 61 70 5b   if( pFd->aMmap[
25de0 30 5d 2e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  0].pMapRegion==0
25df0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
25e00 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61   = osMmap(0, nMa
25e10 70 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  p, flags, MAP_SH
25e20 41 52 45 44 2c 20 70 46 64 2d 3e 68 2c 20 30 29  ARED, pFd->h, 0)
25e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
25e40 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
25e50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
25e60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
25e70 4d 4d 41 50 3b 0a 20 20 20 20 20 20 20 20 7d 0a  MMAP;.        }.
25e80 20 20 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d          pFd->aMm
25e90 61 70 5b 30 5d 2e 70 4d 61 70 52 65 67 69 6f 6e  ap[0].pMapRegion
25ea0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
25eb0 20 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 6d   pFd->aMmap[0].m
25ec0 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
25ed0 20 20 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d          pFd->aMm
25ee0 61 70 5b 30 5d 2e 6d 6d 61 70 4f 72 69 67 73 69  ap[0].mmapOrigsi
25ef0 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20  ze = nMap;.     
25f00 20 7d 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d   }.#if HAVE_MREM
25f10 41 50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77  AP.      /* If w
25f20 65 20 68 61 76 65 20 61 6e 20 6d 72 65 6d 61 70  e have an mremap
25f30 28 29 20 63 61 6c 6c 2c 20 72 65 73 69 7a 65 20  () call, resize 
25f40 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
25f50 70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 65  ping. */.      e
25f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  lse{.        uni
25f70 78 4d 61 70 70 69 6e 67 20 2a 70 4d 61 70 20 3d  xMapping *pMap =
25f80 20 26 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 3b   &pFd->aMmap[0];
25f90 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
25fa0 6f 73 4d 72 65 6d 61 70 28 0a 20 20 20 20 20 20  osMremap(.      
25fb0 20 20 20 20 20 20 70 4d 61 70 2d 3e 70 4d 61 70        pMap->pMap
25fc0 52 65 67 69 6f 6e 2c 20 70 4d 61 70 2d 3e 6d 6d  Region, pMap->mm
25fd0 61 70 4f 72 69 67 73 69 7a 65 2c 20 6e 4d 61 70  apOrigsize, nMap
25fe0 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45  , MREMAP_MAYMOVE
25ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
26000 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
26010 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
26020 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26030 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d   SQLITE_IOERR_MM
26040 41 50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  AP;.        }.  
26050 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d 61 70        pFd->aMmap
26060 5b 30 5d 2e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  [0].pMapRegion =
26070 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
26080 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 6d 6d 61  Fd->aMmap[0].mma
26090 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20  pSize = nMap;.  
260a0 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d 61 70        pFd->aMmap
260b0 5b 30 5d 2e 6d 6d 61 70 4f 72 69 67 73 69 7a 65  [0].mmapOrigsize
260c0 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 20 20 7d   = nMap;.      }
260d0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
260e0 4f 74 68 65 72 77 69 73 65 2c 20 63 72 65 61 74  Otherwise, creat
260f0 65 20 61 20 73 65 63 6f 6e 64 20 6d 61 70 70 69  e a second mappi
26100 6e 67 2e 20 49 66 20 74 68 65 20 65 78 69 73 74  ng. If the exist
26110 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 0a 20  ing mapping is. 
26120 20 20 20 20 20 2a 2a 20 61 20 6d 75 6c 74 69 70       ** a multip
26130 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
26140 69 7a 65 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  ize in size, the
26150 6e 20 72 65 71 75 65 73 74 20 74 68 61 74 20 74  n request that t
26160 68 65 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20  he new.      ** 
26170 6d 61 70 70 69 6e 67 20 69 6d 6d 65 64 69 61 74  mapping immediat
26180 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 6f  ely follow the o
26190 6c 64 20 69 6e 20 76 69 72 74 75 61 6c 20 6d 65  ld in virtual me
261a0 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mory.  */.      
261b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 6e  else{.        un
261c0 69 78 4d 61 70 70 69 6e 67 20 2a 70 4d 61 70 20  ixMapping *pMap 
261d0 3d 20 26 70 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d  = &pFd->aMmap[0]
261e0 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
261f0 70 41 64 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pAddr = 0;..    
26200 20 20 20 20 6e 4d 61 70 20 2d 3d 20 70 4d 61 70      nMap -= pMap
26210 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 0a 20 20 20  ->mmapSize;..   
26220 20 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6d       if( pMap->m
26230 6d 61 70 53 69 7a 65 3d 3d 70 4d 61 70 2d 3e 6d  mapSize==pMap->m
26240 6d 61 70 4f 72 69 67 73 69 7a 65 20 29 7b 0a 20  mapOrigsize ){. 
26250 20 20 20 20 20 20 20 20 20 70 41 64 64 72 20 3d           pAddr =
26260 20 28 76 6f 69 64 20 2a 29 26 28 28 75 38 20 2a   (void *)&((u8 *
26270 29 70 4d 61 70 2d 3e 70 4d 61 70 52 65 67 69 6f  )pMap->pMapRegio
26280 6e 29 5b 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a  n)[pMap->mmapSiz
26290 65 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e];.        }.. 
262a0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 6f 73         pNew = os
262b0 4d 6d 61 70 28 70 41 64 64 72 2c 20 6e 4d 61 70  Mmap(pAddr, nMap
262c0 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
262d0 52 45 44 2c 20 70 46 64 2d 3e 68 2c 20 70 4d 61  RED, pFd->h, pMa
262e0 70 2d 3e 6d 6d 61 70 53 69 7a 65 29 3b 0a 20 20  p->mmapSize);.  
262f0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
26300 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
26310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
26320 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
26330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26340 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 70 41      if( pNew==pA
26350 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
26360 20 70 4d 61 70 2d 3e 6d 6d 61 70 4f 72 69 67 73   pMap->mmapOrigs
26370 69 7a 65 20 2b 3d 20 6e 4d 61 70 3b 0a 20 20 20  ize += nMap;.   
26380 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 6d 6d 61         pMap->mma
26390 70 53 69 7a 65 20 2b 3d 20 6e 4d 61 70 3b 0a 20  pSize += nMap;. 
263a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
263b0 20 20 20 20 20 20 20 20 70 46 64 2d 3e 61 4d 6d          pFd->aMm
263c0 61 70 5b 31 5d 2e 70 4d 61 70 52 65 67 69 6f 6e  ap[1].pMapRegion
263d0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
263e0 20 20 20 70 46 64 2d 3e 61 4d 6d 61 70 5b 31 5d     pFd->aMmap[1]
263f0 2e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70  .mmapSize = nMap
26400 3b 0a 20 20 20 20 20 20 20 20 20 20 70 46 64 2d  ;.          pFd-
26410 3e 61 4d 6d 61 70 5b 31 5d 2e 6d 6d 61 70 4f 72  >aMmap[1].mmapOr
26420 69 67 73 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  igsize = nMap;. 
26430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26440 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
26450 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
26460 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26470 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
26480 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
26490 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
264a0 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
264b0 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
264c0 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
264d0 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
264e0 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
264f0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
26500 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
26510 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
26520 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
26530 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
26540 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
26550 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
26560 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
26570 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
26580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
26590 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
265a0 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
265b0 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
265c0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
265d0 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
265e0 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
265f0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
26600 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
26610 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
26620 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
26630 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
26640 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
26650 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
26660 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
26670 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
26680 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26690 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
266a0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
266b0 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
266c0 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 20 20  , void **pp){.  
266d0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
266e0 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20  (unixFile *)fd; 
266f0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
26700 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
26710 65 20 2a 2f 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  e */.  *pp = 0;.
26720 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
26730 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 69  Limit>0 ){.    i
26740 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
26750 33 5f 69 6e 74 36 34 20 69 4d 61 70 20 3d 20 30  3_int64 iMap = 0
26760 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  ;.    .    if( p
26770 46 64 2d 3e 61 4d 6d 61 70 5b 30 5d 2e 70 4d 61  Fd->aMmap[0].pMa
26780 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
26790 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69      int rc = uni
267a0 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  xMapfile(pFd, -1
267b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
267c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
267d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
267e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
267f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 69   i++){.      uni
26800 78 4d 61 70 70 69 6e 67 20 2a 70 4d 61 70 20 3d  xMapping *pMap =
26810 20 26 70 46 64 2d 3e 61 4d 6d 61 70 5b 69 5d 3b   &pFd->aMmap[i];
26820 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e  .      if( iOff>
26830 3d 69 4d 61 70 20 26 26 20 69 4f 66 66 2b 6e 41  =iMap && iOff+nA
26840 6d 74 3c 3d 28 69 4d 61 70 20 2b 20 70 4d 61 70  mt<=(iMap + pMap
26850 2d 3e 6d 6d 61 70 53 69 7a 65 29 20 29 7b 0a 20  ->mmapSize) ){. 
26860 20 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28         *pp = &((
26870 75 38 20 2a 29 70 4d 61 70 2d 3e 70 4d 61 70 52  u8 *)pMap->pMapR
26880 65 67 69 6f 6e 29 5b 69 4f 66 66 2d 69 4d 61 70  egion)[iOff-iMap
26890 5d 3b 0a 20 20 20 20 20 20 20 20 70 46 64 2d 3e  ];.        pFd->
268a0 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20  nFetchOut++;.   
268b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
268c0 20 20 7d 0a 20 20 20 20 20 20 69 4d 61 70 20 3d    }.      iMap =
268d0 20 70 4d 61 70 2d 3e 6d 6d 61 70 53 69 7a 65 3b   pMap->mmapSize;
268e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
268f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26900 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
26910 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
26920 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
26930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
26940 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66  leases a .** ref
26950 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
26960 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
26970 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28  ll to unixFetch(
26980 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
26990 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
269a0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
269b0 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
269c0 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
269d0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
269e0 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
269f0 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46  sed to the unixF
26a00 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
26a10 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
26a20 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
26a30 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
26a40 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26a50 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
26a60 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
26a70 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
26a80 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
26a90 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
26aa0 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
26ab0 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
26ac0 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
26ad0 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
26ae0 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65  tic int unixUnfe
26af0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
26b00 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
26b10 76 6f 69 64 20 2a 70 29 7b 0a 20 20 75 6e 69 78  void *p){.  unix
26b20 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
26b30 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
26b40 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
26b50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
26b60 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28  ..  /* If p==0 (
26b70 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65  unmap the entire
26b80 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72   file) then ther
26b90 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74  e must be no out
26ba0 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78  standing .  ** x
26bb0 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
26bc0 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d  . Or, if p!=0 (m
26bd0 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20  eaning it is an 
26be0 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
26bf0 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
26c00 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
26c10 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
26c20 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ing.  */.  asser
26c30 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d  t( (p==0)==(pFd-
26c40 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29  >nFetchOut==0) )
26c50 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c  ;..  /* If p!=0,
26c60 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74   it must match t
26c70 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a  he iOff value. *
26c80 2f 0a 20 20 23 69 66 20 30 0a 20 20 61 73 73 65  /.  #if 0.  asse
26c90 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26  rt( p==0 || p==&
26ca0 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
26cb0 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b  Region)[iOff] );
26cc0 0a 20 20 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  .  #endif..  if(
26cd0 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
26ce0 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
26cf0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
26d00 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
26d10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
26d20 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
26d30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26d40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
26d50 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
26d60 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
26d70 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
26d80 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
26d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26da0 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
26db0 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
26dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
26de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
26e30 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
26e40 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
26e50 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
26e60 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
26e70 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
26e80 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
26e90 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
26ea0 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
26eb0 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
26ec0 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
26ed0 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
26ee0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
26ef0 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
26f00 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
26f10 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
26f20 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
26f30 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
26f40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26f50 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
26f60 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
26f70 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
26f80 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
26f90 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
26fa0 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
26fb0 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
26fc0 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
26fd0 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
26fe0 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
26ff0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
27000 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
27010 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
27020 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
27030 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
27040 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
27050 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
27060 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
27070 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
27080 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
27090 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
270a0 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
270b0 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
270c0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
270d0 20 66 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20   finder-funtion 
270e0 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
270f0 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
27100 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
27110 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
27120 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
27130 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
27140 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
27150 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
27160 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
27170 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
27180 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
27190 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
271a0 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
271b0 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
271c0 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
271d0 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
271e0 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
271f0 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
27200 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
27210 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
27220 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
27230 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
27240 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
27250 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
27260 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
27270 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
27280 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
27290 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
272a0 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
272b0 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
272c0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
272d0 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
272e0 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
272f0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
27300 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
27310 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
27320 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
27330 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
27340 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
27350 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
27360 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
27370 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
27380 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
27390 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
273a0 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
273b0 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
273c0 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52  DER, METHOD, VER
273d0 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43  SION, CLOSE, LOC
273e0 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43  K, UNLOCK, CKLOC
273f0 4b 29 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63  K)      \.static
27400 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
27410 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
27420 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27440 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
27450 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
27460 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
27470 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
274a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
274b0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
274c0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
274f0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
27500 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
27510 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
27540 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
27550 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
27560 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
27590 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
275a0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
275b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275f0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
27630 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
27640 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
27650 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
276c0 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27710 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27730 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
27740 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
27760 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
27770 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
27780 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
277b0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
277d0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
27800 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
27810 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
27820 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
27830 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
27840 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
27850 6e 69 78 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  nixShmMap,      
27860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
27870 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
278a0 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
278b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
278c0 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
278f0 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
27900 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
27910 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
27940 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
27950 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
27960 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
27990 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
279a0 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
279b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
279e0 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
279f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
27a00 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
27a80 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
27a90 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
27aa0 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
27ab0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
27ac0 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
27ad0 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
27ae0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
27b20 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b60 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 20 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 20 20 20 20 20 20 5c                 \
27bb0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
27bc0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
27bd0 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
27be0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
27bf0 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
27c00 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
27c10 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
27c20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
27c30 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27c40 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
27c50 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
27c60 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
27c70 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
27c80 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
27c90 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
27ca0 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
27cb0 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
27cc0 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
27cd0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
27ce0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
27cf0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
27d00 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
27d10 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
27d20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
27d30 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
27d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27d50 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
27d60 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
27d70 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
27d80 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27da0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
27db0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27dd0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
27de0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e00 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
27e10 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
27e20 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a  ervedLock     /*
27e30 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
27e40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
27e50 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
27e60 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
27e70 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
27e80 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
27e90 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
27ea0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
27eb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27ec0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
27ed0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ef0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
27f00 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
27f10 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
27f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
27f30 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
27f40 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
27f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
27f60 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
27f70 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
27f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
27f90 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
27fa0 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
27fb0 72 76 65 64 4c 6f 63 6b 20 20 20 2f 2a 20 78 43  rvedLock   /* xC
27fc0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
27fd0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
27fe0 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
27ff0 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
28000 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
28010 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
28020 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
28030 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
28040 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28050 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28060 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
28070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28080 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
28090 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
280a0 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
280b0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
280c0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
280d0 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
280e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
280f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
28100 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
28110 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
28120 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
28130 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
28140 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63  edLock  /* xChec
28150 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
28160 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
28170 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28180 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
28190 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
281a0 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69  ODS(.  flockIoFi
281b0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
281c0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
281d0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c  ion name */.  fl
281e0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
281f0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
28200 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28210 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
28220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28230 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
28240 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
28250 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  abled */.  flock
28260 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
28270 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
28280 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
28290 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
282a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
282b0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55  thod */.  flockU
282c0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
282d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
282e0 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
282f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28300 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k    /* xCheckRe
28310 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
28320 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
28330 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
28340 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
28350 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
28360 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
28370 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
28380 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
28390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
283a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
283b0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
283c0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283e0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
283f0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
28400 65 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  emClose,        
28410 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
28420 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
28430 65 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  emLock,         
28440 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
28450 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
28460 6d 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  mUnlock,        
28470 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
28480 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
28490 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
284a0 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ock      /* xChe
284b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
284c0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
284d0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
284e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
284f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
28500 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
28510 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65  DS(.  afpIoFinde
28520 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
28530 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
28540 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70  on name */.  afp
28550 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
28560 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
28570 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28580 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
285b0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
285c0 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
285d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
285e0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
285f0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
28600 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28610 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
28620 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
28630 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28640 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
28650 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
28660 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
28670 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
28680 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
28690 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
286a0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
286b0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
286c0 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
286d0 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
286e0 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
286f0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
28700 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
28710 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
28720 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
28730 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
28740 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
28750 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
28760 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
28770 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
28780 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
28790 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
287a0 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
287b0 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
287c0 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
287d0 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
287e0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
287f0 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
28800 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
28810 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
28820 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
28830 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
28840 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
28850 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
28860 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
28870 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
28880 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
28890 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
288a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
288b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
288c0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
288d0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
288e0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
288f0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
28900 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
28910 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
28920 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
28930 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
28940 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
28950 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
28960 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
28970 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
28980 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
28990 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
289a0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
289b0 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
289c0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
289d0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
289e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
289f0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
28a20 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
28a30 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
28a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28a50 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28a60 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
28a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28a80 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
28a90 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
28aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28ab0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
28ac0 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
28ad0 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
28ae0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28af0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
28b00 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63  ndif../* nfs loc
28b10 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20  kd on OSX 10.3+ 
28b20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72  doesn't clear wr
28b30 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61  ite locks when a
28b40 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
28b50 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  t */.#if defined
28b60 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
28b70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
28b80 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
28b90 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e  HODS(.  nfsIoFin
28ba0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
28bb0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
28bc0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
28bd0 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  nfsIoMethods,   
28be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
28bf0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28c00 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28c10 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c30 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
28c40 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75   disabled */.  u
28c50 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
28c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28c70 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
28c80 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
28c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28ca0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28cb0 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
28cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28cd0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
28ce0 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
28cf0 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
28d00 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
28d10 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
28d20 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
28d30 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
28d40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28d50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
28d60 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
28d70 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
28d80 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
28d90 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
28da0 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
28db0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
28dc0 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
28dd0 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
28de0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
28df0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
28e00 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
28e10 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
28e20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
28e30 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
28e40 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
28e50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28e60 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
28e70 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
28e80 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
28e90 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
28ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28eb0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
28ec0 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
28ed0 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
28ee0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
28ef0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
28f00 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
28f10 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
28f20 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28f30 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
28f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28f50 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
28f60 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
28f70 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28f80 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
28f90 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
28fa0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
28fb0 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
28fc0 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
28fd0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
28fe0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
28ff0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
29000 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
29010 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
29020 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
29030 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
29040 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
29050 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
29060 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
29070 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
29080 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
29090 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
290a0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
290b0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
290c0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
290d0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
290e0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
290f0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
29100 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
29110 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
29120 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
29130 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
29140 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
29150 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
29160 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
29170 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
29180 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
29190 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
291a0 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
291b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
291c0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
291d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
291e0 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
291f0 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
29200 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
29210 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
29220 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
29230 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
29240 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
29250 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
29260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29270 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
29280 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
29290 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
292a0 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
292b0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
292c0 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
292d0 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
292e0 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
292f0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
29300 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
29310 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
29320 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
29330 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
29340 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
29350 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
29360 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
29370 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
29380 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
29390 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
293a0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
293b0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
293c0 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
293d0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
293e0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
293f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
29400 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
29410 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
29420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
29430 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
29440 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
29450 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
29460 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
29470 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
29480 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29490 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
294a0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
294b0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
294c0 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
294d0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
294e0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
294f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29500 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29510 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
29520 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  #if OS_VXWORKS &
29530 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29540 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
29550 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
29560 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
29570 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
29580 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
29590 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
295a0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
295b0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
295c0 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
295d0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
295e0 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
295f0 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
29600 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
29610 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
29620 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c   for VXWorks onl
29630 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  y..*/.static con
29640 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
29650 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49  thods *autolockI
29660 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
29670 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
29680 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
29690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
296a0 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
296b0 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
296c0 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
296d0 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
296e0 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
296f0 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
29700 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
29710 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
29720 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
29730 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
29740 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
29750 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
29760 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
29770 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
29780 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
29790 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
297a0 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
297b0 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
297c0 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
297d0 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
297e0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
297f0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
29800 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
29810 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
29820 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
29830 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
29840 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
29850 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
29860 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
29870 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
29880 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
29890 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
298a0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
298b0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
298c0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
298d0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
298e0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
298f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
29900 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
29910 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29920 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
29930 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
29940 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
29950 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
29960 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
29970 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
29980 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
29990 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
299a0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
299b0 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
299c0 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
299d0 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
299e0 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
299f0 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
29a00 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29a10 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
29a20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
29a30 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
29a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
29a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29aa0 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
29ab0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
29ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ad0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
29ae0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
29af0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
29b00 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
29b10 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
29b20 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
29b30 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
29b40 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
29b50 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
29b60 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
29b70 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
29b80 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
29b90 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
29ba0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29bb0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
29bc0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
29bd0 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
29be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
29bf0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
29c00 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
29c10 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  g opened */.  sq
29c20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
29c30 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
29c40 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
29c50 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
29c60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29c70 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
29c80 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
29c90 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
29ca0 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20   int ctrlFlags  
29cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
29cc0 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c   or more UNIXFIL
29cd0 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  E_* values */.){
29ce0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
29cf0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
29d00 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
29d10 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
29d20 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
29d30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29d40 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
29d50 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
29d60 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75  ULL );..  /* Usu
29d70 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46  ally the path zF
29d80 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  ilename should n
29d90 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  ot be a relative
29da0 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20   pathname. The. 
29db0 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73   ** exception is
29dc0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
29dd0 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20  e proxy "conch" 
29de0 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74  file in builds t
29df0 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65  hat.  ** include
29e00 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70   the special App
29e10 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  le locking style
29e20 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  s..  */.#if defi
29e30 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29e40 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
29e50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
29e60 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
29e70 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
29e80 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c  e[0]=='/' .    |
29e90 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  | pVfs->pAppData
29ea0 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  ==(void*)&autolo
29eb0 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65  ckIoFinder );.#e
29ec0 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46  lse.  assert( zF
29ed0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
29ee0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
29ef0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
29f00 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72  No locking occur
29f10 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  s in temporary f
29f20 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
29f30 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c  ( zFilename!=0 |
29f40 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  | (ctrlFlags & U
29f50 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21  NIXFILE_NOLOCK)!
29f60 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
29f70 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
29f80 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
29f90 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
29fa0 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56   = h;.  pNew->pV
29fb0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65  fs = pVfs;.  pNe
29fc0 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
29fd0 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74  name;.  pNew->ct
29fe0 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74  rlFlags = (u8)ct
29ff0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  rlFlags;.  pNew-
2a000 3e 6d 6d 61 70 4c 69 6d 69 74 20 3d 20 53 51 4c  >mmapLimit = SQL
2a010 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2a020 5f 4c 49 4d 49 54 3b 0a 20 20 69 66 28 20 73 71  _LIMIT;.  if( sq
2a030 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2a040 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20  n(((ctrlFlags & 
2a050 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20  UNIXFILE_URI) ? 
2a060 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a  zFilename : 0),.
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77             "psow
2a090 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
2a0a0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
2a0b0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2a0c0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2a0d0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  E_PSOW;.  }.  if
2a0e0 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a  ( strcmp(pVfs->z
2a0f0 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22  Name,"unix-excl"
2a100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  )==0 ){.    pNew
2a110 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2a120 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
2a130 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2a140 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
2a150 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
2a160 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
2a170 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
2a180 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67   ){.    ctrlFlag
2a190 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
2a1a0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
2a1b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2a1c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2a1d0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2a1e0 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20  ILE_NOLOCK ){.  
2a1f0 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2a200 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
2a210 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2a220 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2a230 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
2a240 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
2a250 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
2a260 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
2a270 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2a280 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
2a290 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
2a2a0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
2a2b0 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
2a2c0 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
2a2d0 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
2a2e0 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
2a2f0 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
2a300 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
2a310 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
2a320 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
2a330 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2a340 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
2a350 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
2a360 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2a370 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
2a380 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
2a390 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
2a3a0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2a3b0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
2a3c0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2a3d0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2a3e0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2a3f0 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
2a400 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
2a410 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
2a420 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  f.  ){.    unixE
2a430 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2a440 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2a450 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2a460 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2a470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
2a490 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2a4a0 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
2a4b0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
2a4c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
2a4d0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
2a4e0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
2a4f0 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
2a500 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2a510 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
2a520 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
2a530 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
2a540 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
2a550 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
2a560 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
2a570 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
2a580 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
2a590 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
2a5a0 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
2a5b0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
2a5c0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
2a5d0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
2a5e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a5f0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
2a600 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
2a610 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
2a620 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
2a630 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
2a640 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
2a650 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
2a660 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2a670 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
2a680 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
2a690 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
2a6a0 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
2a6b0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
2a6c0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
2a6d0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
2a6e0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
2a6f0 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
2a700 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
2a710 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
2a720 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
2a730 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
2a740 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
2a750 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
2a760 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
2a770 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
2a780 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
2a790 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
2a7a0 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
2a7b0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
2a7c0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
2a7d0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
2a7e0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
2a7f0 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
2a800 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
2a810 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2a820 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2a830 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
2a840 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2a850 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
2a860 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a870 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2a880 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2a890 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2a8a0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
2a8b0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
2a8c0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
2a8d0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2a8e0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2a8f0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2a900 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
2a910 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
2a920 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
2a930 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2a940 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
2a950 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
2a960 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
2a970 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
2a980 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
2a990 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
2a9a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2a9b0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2a9c0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
2a9d0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
2a9e0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2a9f0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
2aa00 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
2aa10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
2aa20 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
2aa30 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
2aa40 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
2aa50 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
2aa60 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
2aa70 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
2aa80 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2aa90 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
2aaa0 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
2aab0 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
2aac0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2aad0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
2aae0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2aaf0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2ab00 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
2ab10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ab20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ab30 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
2ab40 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
2ab50 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
2ab60 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2ab70 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
2ab80 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
2ab90 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2aba0 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
2abb0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2abc0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2abd0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
2abe0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
2abf0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
2ac00 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
2ac10 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
2ac20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
2ac30 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
2ac40 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
2ac50 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
2ac60 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
2ac70 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
2ac80 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
2ac90 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
2aca0 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
2acb0 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
2acc0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
2acd0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
2ace0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2acf0 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
2ad00 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
2ad10 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
2ad20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2ad30 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2ad40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2ad50 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
2ad60 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
2ad70 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
2ad80 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2ad90 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
2ada0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
2adb0 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
2adc0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2add0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2ade0 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
2adf0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2ae00 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
2ae10 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
2ae20 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2ae30 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
2ae40 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
2ae50 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
2ae60 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
2ae70 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2ae80 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2ae90 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2aea0 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2aeb0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
2aec0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
2aed0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2aee0 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
2aef0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
2af00 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
2af10 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
2af20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
2af30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
2af40 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
2af50 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
2af60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2af80 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
2af90 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
2afa0 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
2afb0 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
2afc0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
2afd0 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
2afe0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
2aff0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2b000 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
2b010 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
2b020 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
2b030 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
2b040 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
2b050 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
2b060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2b070 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
2b080 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2b090 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
2b0a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2b0b0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2b0c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
2b0d0 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e 6f   pNew->lastErrno
2b0e0 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58 57   = 0;.#if OS_VXW
2b0f0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53  ORKS.  if( rc!=S
2b100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b110 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
2b120 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2b130 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2b140 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e  h = -1;.    osUn
2b150 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
2b160 0a 20 20 20 20 69 73 44 65 6c 65 74 65 20 3d 20  .    isDelete = 
2b170 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 44  0;.  }.  if( isD
2b180 65 6c 65 74 65 20 29 20 70 4e 65 77 2d 3e 63 74  elete ) pNew->ct
2b190 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2b1a0 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  ILE_DELETE;.#end
2b1b0 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2b1c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2b1d0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2b1e0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2b1f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2b200 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2b210 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2b220 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2b230 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 7d 0a 20  unter(+1);.  }. 
2b240 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b250 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2b260 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
2b270 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
2b280 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
2b290 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
2b2a0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
2b2b0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
2b2c0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
2b2d0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
2b2e0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2b2f0 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
2b300 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2b310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
2b320 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
2b330 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
2b340 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
2b350 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
2b360 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
2b370 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
2b380 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
2b390 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2b3a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2b3b0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2b3c0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
2b3d0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
2b3e0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2b3f0 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
2b400 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2b410 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
2b420 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
2b430 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
2b440 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2b450 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
2b460 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
2b470 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
2b480 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
2b490 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
2b4a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b4b0 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
2b4c0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
2b4d0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2b4e0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
2b4f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b500 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2b510 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
2b520 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2b530 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2b540 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2b550 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2b560 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2b570 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2b580 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2b590 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2b5a0 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2b5b0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2b5c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2b5d0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2b5e0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2b5f0 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
2b600 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2b610 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
2b620 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
2b630 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
2b640 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
2b650 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
2b660 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
2b670 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
2b680 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
2b690 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
2b6a0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2b6b0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2b6c0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2b6d0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2b6e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2b6f0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2b700 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2b710 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2b720 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2b730 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
2b740 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
2b750 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2b760 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2b770 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2b780 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2b790 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
2b7a0 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
2b7b0 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
2b7c0 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
2b7d0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
2b7e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2b7f0 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
2b800 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
2b810 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
2b820 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
2b830 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
2b840 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
2b850 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20  E_PREFIX) + 18) 
2b860 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
2b870 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b880 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2b890 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
2b8a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
2b8b0 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -18, zBuf, "%s/"
2b8c0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
2b8d0 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
2b8e0 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
2b8f0 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
2b900 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2b910 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
2b920 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b930 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
2b940 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
2b950 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
2b960 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
2b970 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
2b980 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
2b990 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
2b9a0 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d  0;.    zBuf[j+1]
2b9b0 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 0;.  }while( 
2b9c0 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29  osAccess(zBuf,0)
2b9d0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2b9e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
2b9f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ba00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2ba10 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2ba20 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
2ba30 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
2ba40 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
2ba50 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
2ba60 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
2ba70 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
2ba80 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
2ba90 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
2baa0 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
2bab0 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
2bac0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
2bad0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
2bae0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
2baf0 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
2bb00 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
2bb10 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
2bb20 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
2bb30 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
2bb40 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
2bb50 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  t was opened on 
2bb60 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
2bb70 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
2bb80 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a  rnal or master-j
2bb90 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65  ournal file) ide
2bba0 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e  ntified by pathn
2bbb0 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74  ame.** zPath wit
2bbc0 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  h SQLITE_OPEN_XX
2bbd0 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67  X flags matching
2bbe0 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73   those passed as
2bbf0 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
2bc00 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2bc10 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2bc20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63  Such a file desc
2bc30 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74  riptor may exist
2bc40 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63   if a database c
2bc50 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
2bc60 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20  osed.** but the 
2bc70 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20  associated file 
2bc80 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64  descriptor could
2bc90 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62   not be closed b
2bca0 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f  ecause some.** o
2bcb0 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
2bcc0 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
2bcd0 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f   same file is ho
2bce0 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63  lding a file-loc
2bcf0 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63  k..** Refer to c
2bd00 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75  omments in the u
2bd10 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  nixClose() funct
2bd20 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ion and the leng
2bd30 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64  thy comment.** d
2bd40 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78  escribing "Posix
2bd50 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
2bd60 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20  g" at the start 
2bd70 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  of this file for
2bd80 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74   .** further det
2bd90 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b  ails. Also, tick
2bda0 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20  et #4018..**.** 
2bdb0 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69  If a suitable fi
2bdc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2bdd0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20   found, then it 
2bde0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2bdf0 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20  no.** such file 
2be00 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f  descriptor is lo
2be10 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74  cated, -1 is ret
2be20 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2be30 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66   UnixUnusedFd *f
2be40 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f  indReusableFd(co
2be50 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2be60 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55   int flags){.  U
2be70 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
2be80 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  used = 0;..  /* 
2be90 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f  Do not search fo
2bea0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2beb0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76   descriptor on v
2bec0 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61  xworks. Not beca
2bed0 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73  use.  ** vxworks
2bee0 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66   would not benef
2bef0 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e  it from the chan
2bf00 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65  ge (it might, we
2bf10 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20  're not sure),. 
2bf20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20   ** but because 
2bf30 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69  no way to test i
2bf40 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
2bf50 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20  vailable. It is 
2bf60 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74  better .  ** not
2bf70 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e   to risk breakin
2bf80 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72  g vxworks suppor
2bf90 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  t for the sake o
2bfa0 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72  f such an obscur
2bfb0 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e  e .  ** feature.
2bfc0 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57    */.#if !OS_VXW
2bfd0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74  ORKS.  struct st
2bfe0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c000 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29  esults of stat()
2c010 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   call */..  /* A
2c020 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
2c030 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
2c040 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
2c050 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
2c060 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
2c070 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
2c080 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
2c090 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
2c0a0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
2c0b0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2c0c0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2c0d0 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
2c0e0 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
2c0f0 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
2c100 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
2c110 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
2c120 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
2c130 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
2c140 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
2c150 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
2c160 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
2c170 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
2c180 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
2c190 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
2c1a0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
2c1b0 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
2c1c0 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
2c1d0 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
2c1e0 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c  g for a resusabl
2c1f0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2c200 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20  r are not dire. 
2c210 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53   */.  if( 0==osS
2c220 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61  tat(zPath, &sSta
2c230 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e  t) ){.    unixIn
2c240 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
2c250 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ..    unixEnterM
2c260 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f  utex();.    pIno
2c270 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
2c280 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64      while( pInod
2c290 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69  e && (pInode->fi
2c2a0 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e  leId.dev!=sStat.
2c2b0 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20  st_dev.         
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2c2d0 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
2c2e0 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
2c2f0 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
2c300 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
2c310 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2c320 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
2c330 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
2c340 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
2c350 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
2c360 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
2c370 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
2c380 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
2c390 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
2c3a0 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
2c3b0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
2c3c0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75        *pp = pUnu
2c3d0 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  sed->pNext;.    
2c3e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2c3f0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2c400 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a    }.#endif    /*
2c410 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
2c420 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
2c430 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sed;.}../*.** Th
2c440 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2c450 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65  alled by unixOpe
2c460 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  n() to determine
2c470 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73   the unix permis
2c480 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61  sions.** to crea
2c490 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74  te new files wit
2c4a0 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  h. If no error o
2c4b0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2c4c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2c4d0 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65  d.** and a value
2c4e0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61   suitable for pa
2c4f0 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69  ssing as the thi
2c500 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  rd argument to o
2c510 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69  pen(2) is.** wri
2c520 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20  tten to *pMode. 
2c530 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
2c540 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
2c550 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
2c560 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
2c570 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d  the value of *pM
2c580 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66  ode is not modif
2c590 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f  ied..**.** In mo
2c5a0 73 74 20 63 61 73 65 73 20 63 61 73 65 73 2c 20  st cases cases, 
2c5b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
2c5c0 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77  s *pMode to 0, w
2c5d0 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
2c5e0 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f  .** an indicatio
2c5f0 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e  n to robust_open
2c600 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  () to create the
2c610 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53   file using.** S
2c620 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2c630 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61  LE_PERMISSIONS a
2c640 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75  djusted by the u
2c650 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20  mask..** But if 
2c660 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2c670 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
2c680 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
2c690 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
2c6a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
2c6b0 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
2c6c0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
2c6d0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
2c6e0 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
2c6f0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2c700 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
2c710 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
2c720 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
2c730 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
2c740 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
2c750 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
2c760 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
2c770 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
2c780 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
2c790 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2c7a0 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
2c7b0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
2c7c0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2c7d0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
2c7e0 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
2c7f0 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
2c800 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
2c810 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
2c820 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
2c830 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
2c840 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
2c850 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
2c860 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
2c870 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
2c880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2c890 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2c8a0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2c8b0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2c8c0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
2c8d0 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
2c8e0 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
2c8f0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c910 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
2c920 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
2c930 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
2c940 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c    mode_t *pMode,
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c960 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
2c970 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
2c980 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64  le with */.  uid
2c990 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c9b0 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20  OUT: uid to set 
2c9c0 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  on the file */. 
2c9d0 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20   gid_t *pGid    
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9f0 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20   /* OUT: gid to 
2ca00 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  set on the file 
2ca10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2ca20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2ca30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ca40 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f  n Code */.  *pMo
2ca50 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20  de = 0;.  *pUid 
2ca60 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30  = 0;.  *pGid = 0
2ca70 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2ca80 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
2ca90 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2caa0 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
2cab0 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50    char zDb[MAX_P
2cac0 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20  ATHNAME+1];     
2cad0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2cae0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
2caf0 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
2cb00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cb10 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
2cb20 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20  tes in zDb */.  
2cb30 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2cb40 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2cb50 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
2cb60 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
2cb70 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
2cb80 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20  zPath is a path 
2cb90 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72  to a WAL or jour
2cba0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f  nal file. The fo
2cbb0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65  llowing block de
2cbc0 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  rives.    ** the
2cbd0 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73   path to the ass
2cbe0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2cbf0 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68   file from zPath
2cc00 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  . This block han
2cc10 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  dles.    ** the 
2cc20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67  following naming
2cc30 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20   conventions:.  
2cc40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c    **.    **   "<
2cc50 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2cc60 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  nal".    **   "<
2cc70 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22  path to db>-wal"
2cc80 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2cc90 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e   to db>-journalN
2cca0 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
2ccb0 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22  th to db>-walNN"
2ccc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77  .    **.    ** w
2ccd0 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63  here NN is a dec
2cce0 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65  imal number. The
2ccf0 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d   NN naming schem
2cd00 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75  es are .    ** u
2cd10 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  sed by the test_
2cd20 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
2cd30 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
2cd40 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Db = sqlite3Strl
2cd50 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b  en30(zPath) - 1;
2cd60 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
2cd70 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
2cd80 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e  .    while( nDb>
2cd90 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  0 && sqlite3Isal
2cda0 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20  num(zPath[nDb]) 
2cdb0 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28  ) nDb--;.    if(
2cdc0 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68   nDb==0 || zPath
2cdd0 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74  [nDb]!='-' ) ret
2cde0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2cdf0 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
2ce00 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2ce10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ce20 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20   nDb>0 );.      
2ce30 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44  assert( zPath[nD
2ce40 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20  b]!='\n' );.    
2ce50 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23    nDb--;.    }.#
2ce60 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79  endif.    memcpy
2ce70 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62  (zDb, zPath, nDb
2ce80 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20  );.    zDb[nDb] 
2ce90 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28  = '\0';..    if(
2cea0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20   0==osStat(zDb, 
2ceb0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2cec0 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e   *pMode = sStat.
2ced0 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a  st_mode & 0777;.
2cee0 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53        *pUid = sS
2cef0 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20  tat.st_uid;.    
2cf00 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e    *pGid = sStat.
2cf10 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73  st_gid;.    }els
2cf20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2cf30 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
2cf40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2cf50 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2cf60 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2cf70 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d  CLOSE ){.    *pM
2cf80 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a  ode = 0600;.  }.
2cf90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cfa0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66  /*.** Open the f
2cfb0 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a  ile zPath..** .*
2cfc0 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68  * Previously, th
2cfd0 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65  e SQLite OS laye
2cfe0 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75 6e  r used three fun
2cff0 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20  ctions in place 
2d000 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a  of this.** one:.
2d010 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
2d020 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
2d030 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2d040 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
2d050 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ();.**     sqlit
2d060 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2d070 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  e();.**.** These
2d080 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e   calls correspon
2d090 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d to the followi
2d0a0 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
2d0b0 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  of flags:.**.** 
2d0c0 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29 20      ReadWrite() 
2d0d0 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49 54  ->     (READWRIT
2d0e0 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20  E | CREATE).**  
2d0f0 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d     ReadOnly()  -
2d100 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29  >     (READONLY)
2d110 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63   .**     OpenExc
2d120 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41  lusive() -> (REA
2d130 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
2d140 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a  | EXCLUSIVE).**.
2d150 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45  ** The old OpenE
2d160 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65 70  xclusive() accep
2d170 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72  ted a boolean ar
2d180 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61  gument - "delFla
2d190 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20  g". If.** true, 
2d1a0 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e  the file was con
2d1b0 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61 75  figured to be au
2d1c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
2d1d0 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ted when the.** 
2d1e0 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73  file handle clos
2d1f0 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74  ed. To achieve t
2d200 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20 75  he same effect u
2d210 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a  sing this new .*
2d220 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64  * interface, add
2d230 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f   the DELETEONCLO
2d240 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65  SE flag to those
2d250 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76 65   specified above
2d260 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63   for .** OpenExc
2d270 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61  lusive()..*/.sta
2d280 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
2d290 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2d2a0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
2d2b0 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20   /* The VFS for 
2d2c0 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74 68  which this is th
2d2d0 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a  e xOpen method *
2d2e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2d2f0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2d300 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20   /* Pathname of 
2d310 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  file to be opene
2d320 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
2d330 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
2d340 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
2d350 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
2d360 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20   filled in */.  
2d370 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d390 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63  Input flags to c
2d3a0 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69  ontrol the openi
2d3b0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  ng */.  int *pOu
2d3c0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
2d3d0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66       /* Output f
2d3e0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f  lags returned to
2d3f0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a   SQLite core */.
2d400 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
2d410 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2d420 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d  File;.  int fd =
2d430 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
2d440 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2d450 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e  escriptor return
2d460 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed by open() */.
2d470 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2d480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d490 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2d4a0 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20  s to open() */. 
2d4b0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
2d4c0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
2d4d0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
2d4e0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2d4f0 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
2d500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d510 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b  rue to omit lock
2d520 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a  ing primitives *
2d530 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2d540 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2d550 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
2d560 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2d570 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d 20  int ctrlFlags = 
2d580 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2d590 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61  * UNIXFILE_* fla
2d5a0 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45  gs */..  int isE
2d5b0 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
2d5c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2d5d0 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
2d5e0 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
2d5f0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2d600 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
2d610 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
2d620 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
2d630 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2d640 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20  _CREATE);.  int 
2d650 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
2d660 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2d670 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2d680 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
2d690 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2d6a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2d6b0 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  TE);.#if SQLITE_
2d6c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2d6d0 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75 74  TYLE.  int isAut
2d6e0 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67 73  oProxy  = (flags
2d6f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41   & SQLITE_OPEN_A
2d700 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69  UTOPROXY);.#endi
2d710 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
2d720 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
2d730 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d740 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74  G_STYLE.  struct
2d750 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2d760 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2d770 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74 65  creating a maste
2d780 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a  r or main-file j
2d790 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e  ournal, this fun
2d7a0 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a  ction will open.
2d7b0 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73 63    ** a file-desc
2d7c0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64 69  riptor on the di
2d7d0 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65  rectory too. The
2d7e0 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69 78   first time unix
2d7f0 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20 63  Sync().  ** is c
2d800 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63 74  alled the direct
2d810 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
2d820 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79 6e  tor will be fsyn
2d830 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65 28  c()ed and close(
2d840 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73  )d..  */.  int s
2d850 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65 61  yncDir = (isCrea
2d860 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
2d870 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2d880 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
2d890 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
2d8a0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2d8b0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
2d8c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2d8d0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
2d8e0 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2d8f0 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
2d900 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
2d910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
2d920 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
2d930 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
2d940 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
2d950 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
2d960 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
2d970 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70    */.  char zTmp
2d980 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
2d990 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E+2];.  const ch
2d9a0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74  ar *zName = zPat
2d9b0 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  h;..  /* Check t
2d9c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
2d9d0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
2d9e0 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
2d9f0 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
2da00 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
2da10 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
2da20 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
2da30 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
2da40 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
2da50 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
2da60 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
2da70 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
2da80 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
2da90 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
2daa0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
2dab0 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
2dac0 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
2dad0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
2dae0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
2daf0 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
2db00 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
2db10 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
2db20 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
2db30 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
2db40 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
2db50 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
2db60 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
2db70 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
2db80 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
2db90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
2dba0 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
2dbb0 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
2dbc0 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
2dbd0 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
2dbe0 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
2dbf0 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
2dc00 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
2dc10 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
2dc20 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
2dc30 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
2dc40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
2dc50 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2dc60 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2dc70 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2dc80 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2dc90 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2dca0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2dcb0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2dcc0 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
2dcd0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2dce0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2dcf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2dd00 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
2dd10 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
2dd20 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
2dd30 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
2dd40 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
2dd50 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
2dd60 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
2dd70 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
2dd80 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
2dd90 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
2dda0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ddb0 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
2ddc0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
2ddd0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
2dde0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2ddf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2de00 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
2de10 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
2de20 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
2de30 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2de40 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2de50 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
2de60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
2de70 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
2de80 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2de90 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
2dea0 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
2deb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2dec0 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70    );..  memset(p
2ded0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
2dee0 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
2def0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2df00 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
2df10 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2df20 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
2df30 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
2df40 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
2df50 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
2df60 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
2df70 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
2df80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2df90 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2dfa0 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2dfb0 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2dfc0 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
2dfd0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2dfe0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2dff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e000 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55   p->pUnused = pU
2e010 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
2e020 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
2e030 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
2e040 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
2e050 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
2e060 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
2e070 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
2e080 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
2e090 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
2e0a0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
2e0b0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
2e0c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2e0d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2e0e0 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
2e0f0 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2e100 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
2e110 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
2e120 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
2e130 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
2e140 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
2e150 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
2e160 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
2e170 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
2e180 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63  syncDir);.    rc
2e190 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61   = unixGetTempna
2e1a0 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me(MAX_PATHNAME+
2e1b0 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  2, zTmpname);.  
2e1c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e1d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2e1e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e1f0 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61    zName = zTmpna
2e200 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  me;..    /* Gene
2e210 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20  rated temporary 
2e220 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c  filenames are al
2e230 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f  ways double-zero
2e240 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20   terminated.    
2e250 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71  ** for use by sq
2e260 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2e270 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
2e280 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c  sert( zName[strl
2e290 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2e2a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  );.  }..  /* Det
2e2b0 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
2e2c0 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
2e2d0 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
2e2e0 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
2e2f0 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
2e300 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
2e310 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
2e320 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
2e330 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
2e340 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
2e350 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
2e360 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
2e370 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
2e380 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
2e390 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
2e3a0 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
2e3b0 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
2e3c0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2e3d0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
2e3e0 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
2e3f0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
2e400 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
2e410 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
2e420 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
2e430 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
2e440 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2e450 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
2e460 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
2e470 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
2e480 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
2e490 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
2e4a0 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
2e4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
2e4c0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
2e4d0 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
2e4e0 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20      uid_t uid;  
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e500 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20    /* Userid for 
2e510 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2e520 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20  gid_t gid;      
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e540 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65   Groupid for the
2e550 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
2e560 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  = findCreateFile
2e570 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  Mode(zName, flag
2e580 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75  s, &openMode, &u
2e590 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69  id, &gid);.    i
2e5a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e5b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e5c0 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b  ( !p->pUnused );
2e5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2e5e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e5f0 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
2e600 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2e610 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
2e620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e630 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
2e640 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2e650 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2e660 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
2e670 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
2e680 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
2e690 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
2e6a0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
2e6b0 26 26 20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52  && errno!=EISDIR
2e6c0 20 26 26 20 69 73 52 65 61 64 57 72 69 74 65 20   && isReadWrite 
2e6d0 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  && !isExclusive 
2e6e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  ){.      /* Fail
2e6f0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ed to open the f
2e700 69 6c 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ile for read/wri
2e710 74 65 20 61 63 63 65 73 73 2e 20 54 72 79 20 72  te access. Try r
2e720 65 61 64 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  ead-only. */.   
2e730 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
2e740 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2e750 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2e760 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 6f  CREATE);.      o
2e770 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f  penFlags &= ~(O_
2e780 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20  RDWR|O_CREAT);. 
2e790 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
2e7a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e7b0 4c 59 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  LY;.      openFl
2e7c0 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
2e7d0 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
2e7e0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 64 20  y = 1;.      fd 
2e7f0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e  = robust_open(zN
2e800 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
2e810 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
2e820 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
2e830 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
2e840 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2e850 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
2e860 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  open", zName);. 
2e870 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66       goto open_f
2e880 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a  inished;.    }..
2e890 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
2e8a0 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
2e8b0 67 20 61 73 20 72 6f 6f 74 20 61 6e 64 20 69 66  g as root and if
2e8c0 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
2e8d0 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
2e8e0 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66  journal or WAL f
2e8f0 69 6c 65 2c 20 73 65 74 20 74 68 65 20 6f 77 6e  ile, set the own
2e900 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 6a 6f  ership of the jo
2e910 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20  urnal or WAL to 
2e920 62 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  be.    ** the sa
2e930 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  me as the origin
2e940 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  al database..   
2e950 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67   */.    if( flag
2e960 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
2e970 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  _WAL|SQLITE_OPEN
2e980 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29  _MAIN_JOURNAL) )
2e990 7b 0a 20 20 20 20 20 20 6f 73 46 63 68 6f 77 6e  {.      osFchown
2e9a0 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a  (fd, uid, gid);.
2e9b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
2e9c0 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69  rt( fd>=0 );.  i
2e9d0 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
2e9e0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
2e9f0 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2ea00 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b  f( p->pUnused ){
2ea10 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
2ea20 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d  >fd = fd;.    p-
2ea30 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20  >pUnused->flags 
2ea40 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
2ea50 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
2ea60 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2ea70 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65     zPath = zName
2ea80 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  ;.#else.    osUn
2ea90 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
2eaa0 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
2eab0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2eac0 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
2ead0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
2eae0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
2eaf0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f  }.#endif..  noLo
2eb00 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49  ck = eType!=SQLI
2eb10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b  TE_OPEN_MAIN_DB;
2eb20 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  ..  .#if defined
2eb30 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53  (__APPLE__) || S
2eb40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2eb50 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
2eb60 20 66 73 74 61 74 66 73 28 66 64 2c 20 26 66 73   fstatfs(fd, &fs
2eb70 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2eb80 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
2eb90 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  File)->lastErrno
2eba0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 6f   = errno;.    ro
2ebb0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2ebc0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2ebd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ebe0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d  OERR_ACCESS;.  }
2ebf0 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2ec00 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49  cmp("msdos", fsI
2ec10 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2ec20 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2ec30 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2ec40 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2ec50 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2ec60 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OS;.  }.#endif..
2ec70 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72    /* Set up appr
2ec80 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67  opriate ctrlFlag
2ec90 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c  s */.  if( isDel
2eca0 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20  ete )           
2ecb0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2ecc0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2ecd0 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  E;.  if( isReado
2ece0 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20  nly )           
2ecf0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2ed00 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
2ed10 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20  .  if( noLock ) 
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed30 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2ed40 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2ed50 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20   if( syncDir )  
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2ed70 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2ed80 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
2ed90 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2eda0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74  TE_OPEN_URI ) ct
2edb0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2edc0 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51  ILE_URI;..#if SQ
2edd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ede0 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
2edf0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2ee00 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
2ee10 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
2ee20 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
2ee30 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
2ee40 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
2ee50 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
2ee60 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
2ee70 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
2ee80 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
2ee90 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
2eea0 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
2eeb0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
2eec0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2eed0 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
2eee0 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
2eef0 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
2ef00 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
2ef10 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
2ef20 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
2ef30 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
2ef40 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
2ef50 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
2ef60 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
2ef70 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
2ef80 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
2ef90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
2efa0 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
2efb0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
2efc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
2efd0 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
2efe0 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
2eff0 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
2f000 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
2f010 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
2f020 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
2f030 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2f040 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
2f050 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
2f060 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
2f070 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
2f080 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
2f090 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
2f0a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2f0b0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
2f0c0 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
2f0d0 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
2f0e0 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
2f0f0 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
2f100 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
2f110 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
2f120 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
2f130 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
2f140 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
2f150 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2f160 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
2f170 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
2f180 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
2f190 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
2f1a0 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
2f1b0 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
2f1c0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2f1d0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2f1e0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2f1f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f200 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
2f210 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  .        goto op
2f220 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
2f230 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65 50 72     }.      usePr
2f240 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
2f250 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
2f260 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f270 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
2f280 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
2f290 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
2f2a0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
2f2b0 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
2f2c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f2d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2f2e0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
2f2f0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
2f300 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
2f310 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
2f320 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2f340 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
2f350 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
2f360 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
2f370 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
2f380 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
2f390 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
2f3a0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
2f3b0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
2f3c0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
2f3d0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
2f3e0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
2f3f0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
2f400 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
2f410 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
2f420 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
2f430 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
2f440 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f450 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2f460 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
2f470 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
2f480 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2f490 0a 20 20 0a 20 20 70 2d 3e 73 7a 53 79 73 70 61  .  .  p->szSyspa
2f4a0 67 65 20 3d 20 75 6e 69 78 47 65 74 50 61 67 65  ge = unixGetPage
2f4b0 73 69 7a 65 28 29 3b 0a 20 20 72 63 20 3d 20 66  size();.  rc = f
2f4c0 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
2f4d0 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
2f4e0 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
2f4f0 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  ;..open_finished
2f500 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
2f510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2f520 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e  ite3_free(p->pUn
2f530 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  used);.  }.  ret
2f540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2f550 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
2f560 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  e at zPath. If t
2f570 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
2f580 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79  ent is true, fsy
2f590 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65  nc().** the dire
2f5a0 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65  ctory after dele
2f5b0 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ting the file..*
2f5c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2f5d0 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  xDelete(.  sqlit
2f5e0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
2f5f0 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74       /* VFS cont
2f600 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74  aining this as t
2f610 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f  he xDelete metho
2f620 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2f630 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
2f640 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
2f650 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a   to be deleted *
2f660 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20  /.  int dirSync 
2f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f680 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28   If true, fsync(
2f690 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  ) directory afte
2f6a0 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20  r deleting file 
2f6b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2f6c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e   SQLITE_OK;.  UN
2f6d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
2f6e0 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c  otUsed);.  Simul
2f6f0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
2f700 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
2f710 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73  ELETE);.  if( os
2f720 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28  Unlink(zPath)==(
2f730 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65  -1) ){.    if( e
2f740 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno==ENOENT ){.
2f750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f760 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
2f770 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
2f780 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
2f790 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2f7a0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
2f7b0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
2f7c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2f7d0 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
2f7e0 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2f7f0 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
2f800 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
2f810 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
2f820 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
2f830 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
2f840 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2f850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
2f860 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
2f870 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
2f880 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
2f890 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
2f8a0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
2f8b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
2f8c0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2f8d0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
2f8e0 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
2f8f0 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
2f900 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
2f910 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
2f920 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
2f930 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
2f940 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EN ){.      rc =
2f950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f960 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2f970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f980 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
2f990 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tence of or acce
2f9a0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
2f9b0 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
2f9c0 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
2f9d0 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
2f9e0 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
2f9f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
2fa00 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2fa10 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
2fa20 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
2fa30 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
2fa40 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
2fa50 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
2fa60 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
2fa70 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
2fa80 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
2fa90 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
2faa0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
2fab0 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
2fac0 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
2fad0 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
2fae0 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
2faf0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
2fb00 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
2fb10 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
2fb20 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
2fb30 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
2fb40 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
2fb50 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
2fb60 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
2fb70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2fb90 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
2fba0 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
2fbb0 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
2fbc0 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
2fbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2fbe0 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
2fbf0 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
2fc00 69 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20  int amode = 0;. 
2fc10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2fc20 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69  R(NotUsed);.  Si
2fc30 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2fc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2fc50 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
2fc60 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
2fc70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2fc80 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
2fc90 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f        amode = F_
2fca0 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OK;.      break;
2fcb0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2fcc0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
2fcd0 45 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d  E:.      amode =
2fce0 20 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20   W_OK|R_OK;.    
2fcf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2fd00 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
2fd10 52 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64  READ:.      amod
2fd20 65 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = R_OK;.      
2fd30 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
2fd40 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
2fd50 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
2fd60 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
2fd70 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28  }.  *pResOut = (
2fd80 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20  osAccess(zPath, 
2fd90 61 6d 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66  amode)==0);.  if
2fda0 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
2fdb0 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 26 26  ACCESS_EXISTS &&
2fdc0 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20   *pResOut ){.   
2fdd0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2fde0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ;.    if( 0==osS
2fdf0 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29  tat(zPath, &buf)
2fe00 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d   && buf.st_size=
2fe10 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  =0 ){.      *pRe
2fe20 73 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  sOut = 0;.    }.
2fe30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2fe40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
2fe50 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
2fe60 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
2fe70 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
2fe80 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   The relative pa
2fe90 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  th.** is stored 
2fea0 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  as a nul-termina
2feb0 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68  ted string in th
2fec0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
2fed0 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e   to by.** zPath.
2fee0 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69   .**.** zOut poi
2fef0 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
2ff00 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69  of at least sqli
2ff10 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
2ff20 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e  me bytes .** (in
2ff30 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f   this case, MAX_
2ff40 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e  PATHNAME bytes).
2ff50 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69   The full-path i
2ff60 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  s written to.** 
2ff70 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f  this buffer befo
2ff80 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
2ff90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2ffa0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
2ffb0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ffc0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2ffd0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2ffe0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
2fff0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
30000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
30010 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
30020 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
30030 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20  nt nOut,        
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30050 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
30060 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
30070 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20  /.  char *zOut  
30080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30090 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
300a0 65 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49  er */.){..  /* I
300b0 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
300c0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
300d0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
300e0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
300f0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
30100 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
30110 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
30120 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
30130 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
30140 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
30150 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
30160 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
30170 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
30180 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
30190 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
301a0 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
301b0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
301c0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
301d0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61  TE_ERROR );..  a
301e0 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50  ssert( pVfs->mxP
301f0 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54  athname==MAX_PAT
30200 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45  HNAME );.  UNUSE
30210 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
30220 29 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  );..  zOut[nOut-
30230 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28  1] = '\0';.  if(
30240 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29   zPath[0]=='/' )
30250 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
30260 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
30270 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
30280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
30290 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20  t nCwd;.    if( 
302a0 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  osGetcwd(zOut, n
302b0 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-1)==0 ){.   
302c0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
302d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
302e0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65  NTOPEN_BKPT, "ge
302f0 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20  tcwd", zPath);. 
30300 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20     }.    nCwd = 
30310 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
30320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
30330 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77  nprintf(nOut-nCw
30340 64 2c 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20  d, &zOut[nCwd], 
30350 22 2f 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20  "/%s", zPath);. 
30360 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
30370 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
30380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
30390 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
303a0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
303b0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
303c0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
303d0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
303e0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
303f0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
30400 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
30410 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
30420 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
30430 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
30440 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
30450 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
30460 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
30470 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
30480 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
30490 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
304a0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
304b0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
304c0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
304d0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
304e0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
304f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
30500 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
30510 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
30520 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
30530 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
30540 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
30550 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
30560 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
30570 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
30580 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
30590 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
305a0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
305b0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
305c0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
305d0 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
305e0 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
305f0 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
30600 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
30610 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
30620 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30630 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
30640 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
30650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
30660 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
30670 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
30680 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
30690 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
306a0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
306b0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
306c0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
306d0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
306e0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
306f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
30700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
30710 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
30720 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
30730 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
30740 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
30750 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
30760 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
30770 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
30780 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
30790 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
307a0 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
307b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
307c0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
307d0 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
307e0 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
307f0 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
30800 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
30810 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
30820 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
30830 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
30840 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
30850 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
30860 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
30870 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
30880 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
30890 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
308a0 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
308b0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
308c0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
308d0 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
308e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
308f0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
30900 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
30910 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
30920 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30930 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
30940 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
30950 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
30960 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
30970 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
30980 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
30990 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
309a0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
309b0 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
309c0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
309d0 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
309e0 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
309f0 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
30a00 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
30a10 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
30a20 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
30a30 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
30a40 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
30a50 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
30a60 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
30a70 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
30a80 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
30a90 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
30aa0 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
30ab0 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
30ac0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
30ad0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30ae0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
30af0 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
30b00 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
30b10 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
30b20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
30b30 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
30b40 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
30b50 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
30b60 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
30b70 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
30b80 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30b90 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
30ba0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
30bb0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
30bc0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
30bd0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
30be0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
30bf0 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
30c00 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
30c10 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
30c20 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
30c30 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
30c40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
30c50 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
30c60 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
30c70 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
30c80 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
30c90 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
30ca0 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
30cb0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
30cc0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
30cd0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
30ce0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
30cf0 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
30d00 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
30d10 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
30d20 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
30d30 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
30d40 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
30d50 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
30d60 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
30d70 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
30d80 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
30d90 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
30da0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
30db0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
30dc0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
30dd0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
30de0 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
30df0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
30e00 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
30e10 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
30e20 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
30e30 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
30e40 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
30e50 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
30e60 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
30e70 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
30e80 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
30e90 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
30ea0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
30eb0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
30ec0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
30ed0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
30ee0 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
30ef0 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
30f00 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
30f10 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
30f20 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
30f30 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
30f40 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
30f50 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
30f60 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
30f70 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
30f80 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
30f90 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
30fa0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
30fb0 66 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  f);.#if !defined
30fc0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
30fd0 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66  {.    int pid, f
30fe0 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d  d, got;.    fd =
30ff0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64   robust_open("/d
31000 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
31010 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69  DONLY, 0);.    i
31020 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
31030 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
31040 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
31050 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
31060 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
31070 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
31080 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
31090 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
310a0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
310b0 70 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  pid));.      ass
310c0 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73  ert( sizeof(t)+s
310d0 69 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a  izeof(pid)<=(siz
310e0 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
310f0 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
31100 74 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29  t) + sizeof(pid)
31110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31120 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52     do{ got = osR
31130 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
31140 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  uf); }while( got
31150 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
31160 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
31170 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
31180 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
31190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
311a0 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
311b0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
311c0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
311d0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
311e0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
311f0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
31200 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
31210 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
31220 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
31230 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
31240 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
31250 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
31260 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
31270 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
31280 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
31290 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
312a0 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
312b0 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
312c0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
312d0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
312e0 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
312f0 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
31300 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
31310 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
31320 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
31330 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
31340 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
31350 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
31360 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
31370 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
31380 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
31390 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
313a0 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
313b0 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
313c0 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
313d0 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
313e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
313f0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
31400 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
31410 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
31420 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
31430 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
31440 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
31450 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
31460 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
31470 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
31480 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
31490 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
314a0 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
314b0 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
314c0 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
314d0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
314e0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
314f0 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
31500 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
31510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
31520 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
31530 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
31540 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
31550 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
31560 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
31570 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
31580 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
31590 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
315a0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
315b0 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
315c0 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
315d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
315e0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
315f0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
31600 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
31610 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
31620 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
31630 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
31640 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
31650 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
31660 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
31670 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
31680 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
31690 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
316a0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
316b0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
316c0 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
316d0 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
316e0 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
316f0 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
31700 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
31710 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
31720 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
31730 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
31740 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
31750 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
31760 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
31770 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
31780 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
31790 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
317a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
317b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
317c0 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
317d0 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
317e0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
317f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
31800 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
31810 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31820 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
31830 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
31840 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
31850 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
31860 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
31870 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
31880 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63  640000;.  int rc
31890 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69   = SQLITE_OK;.#i
318a0 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
318b0 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
318c0 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
318d0 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65  piNow = ((sqlite
318e0 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20  3_int64)t)*1000 
318f0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c  + unixEpoch;.#el
31900 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
31910 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
31920 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
31930 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
31940 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
31950 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
31960 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
31970 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
31980 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  _sec + sNow.tv_n
31990 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c  sec/1000000;.#el
319a0 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
319b0 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69 66 28 20  val sNow;.  if( 
319c0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
319d0 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ow, 0)==0 ){.   
319e0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
319f0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
31a00 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
31a10 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
31a20 75 73 65 63 2f 31 30 30 30 3b 0a 20 20 7d 65 6c  usec/1000;.  }el
31a30 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
31a40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
31a50 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
31a60 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
31a70 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
31a80 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
31a90 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
31aa0 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
31ab0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
31ac0 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
31ad0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
31ae0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31af0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31b00 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
31b10 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
31b20 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
31b30 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
31b40 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
31b50 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
31b60 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
31b70 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
31b80 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
31b90 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
31ba0 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
31bb0 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
31bc0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
31bd0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
31be0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
31bf0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
31c00 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
31c10 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
31c20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
31c30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31c40 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
31c50 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
31c60 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
31c70 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
31c80 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
31c90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20  rc;.}../*.** We 
31ca0 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
31cb0 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
31cc0 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
31cd0 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
31ce0 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
31cf0 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
31d00 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
31d10 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
31d20 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
31d30 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
31d40 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
31d50 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
31d60 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
31d70 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
31d80 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
31d90 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
31da0 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
31db0 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
31dc0 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
31dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31de0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
31df0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31e00 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
31e10 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
31e20 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
31e30 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
31e40 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
31e50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
31e60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31e70 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
31e80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
31e90 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
31ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
31eb0 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  f sqlite3_vfs me
31ec0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
31ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31ee0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
31ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f30 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
31f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31f80 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
31f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
31fa0 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e  gin Proxy Lockin
31fb0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
31fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31fd0 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c  **.**.** Proxy l
31fe0 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65  ocking is a "ube
31ff0 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64  r-locking-method
32000 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a  " in this sense:
32010 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a    It uses the.**
32020 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d   other locking m
32030 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64  ethods on second
32040 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20  ary lock files. 
32050 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
32060 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65  s a.** meta-laye
32070 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68  r over top of th
32080 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b  e primitive lock
32090 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ing implemented 
320a0 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  above.  For.** t
320b0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
320c0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
320d0 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78  plements of prox
320e0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66  y locking is def
320f0 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c  erred.** until l
32100 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ate in the file 
32110 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c  (here) after all
32120 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f   of the other I/
32130 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a  O methods have.*
32140 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d  * been defined -
32150 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69   so that the pri
32160 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d  mitive locking m
32170 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c  ethods are avail
32180 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69  able.** as servi
32190 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68  ces to help with
321a0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
321b0 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  ion of proxy loc
321c0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a  king..**.****.**
321d0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
321e0 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20  locking schemes 
321f0 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79  in SQLite use by
32200 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f  te-range locks o
32210 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
32220 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69  e file to coordi
32230 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75  nate safe, concu
32240 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20  rrent access by 
32250 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
32260 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20  .** and writers 
32270 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f  [http://sqlite.o
32280 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d  rg/lockingv3.htm
32290 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69  l].  The five fi
322a0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  le locking.** st
322b0 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20  ates (UNLOCKED, 
322c0 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c  PENDING, SHARED,
322d0 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55   RESERVED, EXCLU
322e0 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d  SIVE) are implem
322f0 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49  ented.** as POSI
32300 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c  X read & write l
32310 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20  ocks over fixed 
32320 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73  set of locations
32330 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a   (via fsctl),.**
32340 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20   on AFP and SMB 
32350 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62  only exclusive b
32360 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
32370 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69  are available vi
32380 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20  a fsctl.** with 
32390 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73  _IOWR('z', 23, s
323a0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
323b0 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b  ockPB2) to track
323c0 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74   the same 5 stat
323d0 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61  es..** To simula
323e0 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20  te a F_RDLCK on 
323f0 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65  the shared range
32400 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f  , on AFP a rando
32410 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20  mly selected.** 
32420 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73  address in the s
32430 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
32440 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45  aken for a SHARE
32450 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69  D lock, the enti
32460 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e  re.** shared ran
32470 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20  ge is taken for 
32480 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32490 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50  k):.**.**      P
324a0 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20  ENDING_BYTE     
324b0 20 20 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a     0x40000000.**
324c0 20 20 20 20 20 20 52 45 53 45 52 56 45 44 5f 42        RESERVED_B
324d0 59 54 45 20 20 20 20 20 20 20 30 78 34 30 30 30  YTE       0x4000
324e0 30 30 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41  0001.**      SHA
324f0 52 45 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20  RED_RANGE       
32500 20 30 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30   0x40000002 -> 0
32510 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20  x40000200.**.** 
32520 54 68 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20  This works well 
32530 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
32540 65 20 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68  e system, but sh
32550 6f 77 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30  ows a nearly 100
32560 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e  x.** slowdown in
32570 20 72 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63   read performanc
32580 65 20 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65  e on AFP because
32590 20 74 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20   the AFP client 
325a0 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20  disables.** the 
325b0 72 65 61 64 20 63 61 63 68 65 20 77 68 65 6e 20  read cache when 
325c0 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
325d0 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45   are present.  E
325e0 6e 61 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nabling the read
325f0 0a 2a 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65  .** cache expose
32600 73 20 61 20 63 61 63 68 65 20 63 6f 68 65 72 65  s a cache cohere
32610 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  ncy problem that
32620 20 69 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61   is present on a
32630 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f  ll OS X.** suppo
32640 72 74 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c  rted network fil
32650 65 20 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20  e systems.  NFS 
32660 61 6e 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73  and AFP both obs
32670 65 72 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73  erve the.** clos
32680 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74  e-to-open semant
32690 69 63 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ics for ensuring
326a0 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79   cache coherency
326b0 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e  .** [http://nfs.
326c0 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
326d0 23 66 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20  #faq_a8], which 
326e0 64 6f 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69  does not effecti
326f0 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20  vely.** address 
32700 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73  the requirements
32710 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20   for concurrent 
32720 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
32730 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72  by multiple.** r
32740 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
32750 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77  rs.** [http://ww
32760 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c  w.nabble.com/SQL
32770 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65  ite-on-NFS-cache
32780 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36  -coherency-td156
32790 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a  55701.html]..**.
327a0 2a 2a 20 54 6f 20 61 64 64 72 65 73 73 20 74 68  ** To address th
327b0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e  e performance an
327c0 64 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  d cache coherenc
327d0 79 20 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20  y issues, proxy 
327e0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  file locking.** 
327f0 63 68 61 6e 67 65 73 20 74 68 65 20 77 61 79 20  changes the way 
32800 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
32810 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79  is controlled by
32820 20 6c 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73   limiting access
32830 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20   to a.** single 
32840 68 6f 73 74 20 61 74 20 61 20 74 69 6d 65 20 61  host at a time a
32850 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c  nd moving file l
32860 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20  ocks off of the 
32870 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
32880 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78   and onto a prox
32890 79 20 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  y file on the lo
328a0 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  cal file system.
328b0 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e    .**.**.** Usin
328c0 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a  g proxy locks.**
328d0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
328e0 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a  --.**.** C APIs.
328f0 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  **.**  sqlite3_f
32900 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
32910 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53  dbname, SQLITE_S
32920 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
32930 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
32940 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78             <prox
32950 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f  y_path> | ":auto
32960 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :");.**  sqlite3
32970 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
32980 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
32990 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
329a0 4c 45 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68  LE, &<proxy_path
329b0 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
329c0 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
329d0 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
329e0 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
329f0 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
32a00 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
32a10 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
32a20 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
32a30 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
32a40 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
32a50 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
32a60 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
32a70 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
32a80 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
32a90 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
32aa0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
32ab0 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
32ac0 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
32ad0 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
32ae0 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
32af0 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
32b00 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
32b10 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
32b20 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
32b30 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
32b40 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
32b50 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
32b60 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
32b70 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
32b80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
32b90 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
32ba0 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
32bb0 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
32bc0 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
32bd0 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
32be0 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
32bf0 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
32c00 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
32c10 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
32c20 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
32c30 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
32c40 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
32c50 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
32c60 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
32c70 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
32c80 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
32c90 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
32ca0 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
32cb0 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
32cc0 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
32cd0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
32ce0 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
32cf0 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
32d00 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
32d10 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
32d20 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
32d30 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
32d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d50 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
32d60 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
32d70 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
32d80 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
32d90 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
32da0 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
32db0 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
32dc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
32dd0 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
32de0 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
32df0 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
32e00 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
32e10 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
32e20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
32e30 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
32e40 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
32e50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
32e60 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
32e70 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
32e80 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
32e90 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
32ea0 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
32eb0 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
32ec0 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
32ed0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
32ee0 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
32ef0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
32f00 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
32f10 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
32f20 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
32f30 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
32f40 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
32f50 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
32f60 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
32f70 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
32f80 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
32f90 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
32fa0 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
32fb0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
32fc0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
32fd0 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
32fe0 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
32ff0 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
33000 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
33010 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
33020 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
33030 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
33040 74 27 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  t's contents do 
33050 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
33060 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
33070 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
33080 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
33090 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
330a0 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
330b0 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
330c0 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
330d0 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
330e0 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
330f0 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
33100 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
33110 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
33120 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
33130 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
33140 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
33150 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
33160 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
33170 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
33180 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
33190 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
331a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
331b0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
331c0 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
331d0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
331e0 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
331f0 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
33200 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
33210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
33220 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
33230 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
33240 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
33250 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
33260 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
33270 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
33280 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
33290 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
332a0 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
332b0 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
332c0 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
332d0 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
332e0 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
332f0 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
33300 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
33310 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
33320 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
33330 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
33340 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
33350 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
33360 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
33370 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
33380 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
33390 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
333a0 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
333b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
333c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
333d0 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
333e0 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
333f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
33400 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
33410 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
33420 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
33430 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
33440 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
33450 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
33460 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
33470 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
33480 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
33490 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
334a0 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
334b0 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
334c0 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
334d0 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
334e0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
334f0 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
33500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
33510 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
33520 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
33530 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
33540 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
33550 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
33560 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
33570 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
33580 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
33590 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
335a0 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
335b0 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
335c0 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
335d0 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
335e0 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
335f0 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
33600 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
33610 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
33620 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
33630 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
33640 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
33650 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
33660 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
33670 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
33680 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
33690 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
336a0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
336b0 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
336c0 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
336d0 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
336e0 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
336f0 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
33700 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
33710 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
33720 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
33730 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
33740 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
33750 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
33760 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
33770 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
33780 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
33790 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
337a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
337b0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
337c0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
337d0 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
337e0 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
337f0 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
33800 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
33810 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
33820 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
33830 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
33840 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
33850 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
33860 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
33870 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
33880 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
33890 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
338a0 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
338b0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
338c0 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
338d0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
338e0 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
338f0 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
33900 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
33910 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
33920 70 6c 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20  plicity calling 
33930 74 68 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  the SQLITE_SET_L
33940 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61  OCKPROXYFILE pra
33950 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65  gma or.** sqlite
33960 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50  _file_control AP
33970 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65  I is not affecte
33980 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43  d by SQLITE_FORC
33990 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29  E_PROXY_LOCKING)
339a0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78  ..*/../*.** Prox
339b0 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c  y locking is onl
339c0 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d  y available on M
339d0 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65  acOSX .*/.#if de
339e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
339f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
33a00 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
33a10 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  ./*.** The proxy
33a20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68  LockingContext h
33a30 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20  as the path and 
33a40 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  file structures 
33a50 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a  for the remote .
33a60 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f  ** and local pro
33a70 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a  xy files in it.*
33a80 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
33a90 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
33aa0 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  text proxyLockin
33ab0 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
33ac0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
33ad0 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c  text {.  unixFil
33ae0 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20  e *conchFile;   
33af0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
33b00 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nch file */.  ch
33b10 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74  ar *conchFilePat
33b20 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  h;         /* Na
33b30 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
33b40 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
33b50 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20  le *lockProxy;  
33b60 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
33b70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
33b80 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72  /.  char *lockPr
33b90 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20  oxyPath;        
33ba0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
33bb0 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
33bc0 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74  */.  char *dbPat
33bd0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
33be0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
33bf0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20   open file */.  
33c00 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20  int conchHeld;  
33c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33c20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69  1 if the conch i
33c30 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f  s held, -1 if lo
33c40 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64  ckless */.  void
33c50 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74   *oldLockingCont
33c60 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  ext;     /* Orig
33c70 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74  inal lockingcont
33c80 65 78 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f  ext to restore o
33c90 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c  n close */.  sql
33ca0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
33cb0 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f  const *pOldMetho
33cc0 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  d;     /* Origin
33cd0 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66  al I/O methods f
33ce0 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a  or close */.};..
33cf0 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79  /* .** The proxy
33d00 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
33d10 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
33d20 20 61 74 20 64 62 50 61 74 68 20 69 73 20 77 72   at dbPath is wr
33d30 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68  itten into lPath
33d40 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74  , .** which must
33d50 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c   point to valid,
33d60 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
33d70 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
33d80 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74  r a maxLen lengt
33d90 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20  h.** file path. 
33da0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33db0 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28  roxyGetLockPath(
33dc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
33dd0 74 68 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c  th, char *lPath,
33de0 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b   size_t maxLen){
33df0 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
33e00 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69  t dbLen;.  int i
33e10 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52  ;..#ifdef LOCKPR
33e20 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73  OXYDIR.  len = s
33e30 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f  trlcpy(lPath, LO
33e40 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c  CKPROXYDIR, maxL
33e50 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64  en);.#else.# ifd
33e60 65 66 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  ef _CS_DARWIN_US
33e70 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a  ER_TEMP_DIR.  {.
33e80 20 20 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72      if( !confstr
33e90 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52  (_CS_DARWIN_USER
33ea0 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68  _TEMP_DIR, lPath
33eb0 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20  , maxLen) ){.   
33ec0 20 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54     OSTRACE(("GET
33ed0 4c 4f 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64  LOCKPATH  failed
33ee0 20 25 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64   %s errno=%d pid
33ef0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
33f00 20 20 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72         lPath, er
33f10 72 6e 6f 2c 20 67 65 74 70 69 64 28 29 29 29 3b  rno, getpid()));
33f20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
33f30 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
33f40 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
33f50 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
33f60 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20  "sqliteplocks", 
33f70 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d  maxLen);    .  }
33f80 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20  .# else.  len = 
33f90 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22  strlcpy(lPath, "
33fa0 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  /tmp/", maxLen);
33fb0 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
33fc0 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e  .  if( lPath[len
33fd0 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  -1]!='/' ){.    
33fe0 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50  len = strlcat(lP
33ff0 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e  ath, "/", maxLen
34000 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74  );.  }.  .  /* t
34010 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20  ransform the db 
34020 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65  path to a unique
34030 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20   cache name */. 
34040 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74   dbLen = (int)st
34050 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20  rlen(dbPath);.  
34060 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65  for( i=0; i<dbLe
34070 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28  n && (i+len+7)<(
34080 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29  int)maxLen; i++)
34090 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64  {.    char c = d
340a0 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50  bPath[i];.    lP
340b0 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d  ath[i+len] = (c=
340c0 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d  ='/')?'_':c;.  }
340d0 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d  .  lPath[i+len]=
340e0 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28  '\0';.  strlcat(
340f0 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c  lPath, ":auto:",
34100 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52   maxLen);.  OSTR
34110 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
34120 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
34130 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
34140 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28 29   lPath, getpid()
34150 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
34160 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20  ITE_OK;.}../* . 
34170 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c  ** Creates the l
34180 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79  ock file and any
34190 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f   missing directo
341a0 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68  ries in lockPath
341b0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
341c0 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
341d0 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
341e0 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74  lockPath){.  int
341f0 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20   i, len;.  char 
34200 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  buf[MAXPATHLEN];
34210 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
34220 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f  ;.  .  assert(lo
34230 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20  ckPath!=NULL);. 
34240 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
34250 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d  e all the interm
34260 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69  ediate directori
34270 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69  es */.  len = (i
34280 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61  nt)strlen(lockPa
34290 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20  th);.  buf[0] = 
342a0 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66  lockPath[0];.  f
342b0 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20  or( i=1; i<len; 
342c0 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  i++ ){.    if( l
342d0 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f  ockPath[i] == '/
342e0 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20  ' && (i - start 
342f0 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  > 0) ){.      /*
34300 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c   only mkdir if l
34310 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f  eaf dir != "." o
34320 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f  r "/" or ".." */
34330 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61  .      if( i-sta
34340 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74  rt>2 || (i-start
34350 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==1 && buf[start
34360 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
34370 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a  start] != '/') .
34380 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73           || (i-s
34390 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73  tart==2 && buf[s
343a0 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
343b0 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20  buf[start+1] != 
343c0 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
343d0 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20  buf[i]='\0';.   
343e0 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72       if( osMkdir
343f0 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46  (buf, SQLITE_DEF
34400 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
34410 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
34420 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
34430 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
34440 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
34450 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   ) {.           
34460 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
34470 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45  ELOCKPATH  FAILE
34480 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22  D creating %s, "
34490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
344a0 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78        "'%s' prox
344b0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
344c0 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
344d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
344e0 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  uf, strerror(err
344f0 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ), lockPath, get
34500 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20  pid()));.       
34510 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b       return err;
34520 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34540 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a       start=i+1;.
34550 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d      }.    buf[i]
34560 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a   = lockPath[i];.
34570 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
34580 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
34590 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
345a0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f  %s pid=%d\n", lo
345b0 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
345c0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
345d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
345e0 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
345f0 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
34600 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
34610 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
34620 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
34630 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
34640 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
34650 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
34660 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
34670 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
34680 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
34690 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
346a0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
346b0 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
346c0 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
346d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
346e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
346f0 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
34700 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
34710 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
34720 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
34730 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
34740 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
34750 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
34760 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
34770 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
34780 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
34790 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
347a0 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
347b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
347c0 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
347d0 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
347e0 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
347f0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  nt fd = -1;.  un
34800 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
34810 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34820 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  OK;.  int openFl
34830 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
34840 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65  _CREAT;.  sqlite
34850 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a  3_vfs dummyVfs;.
34860 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30    int terrno = 0
34870 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
34880 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c   *pUnused = NULL
34890 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74  ;..  /* 1. first
348a0 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65   try to open/cre
348b0 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  ate the file.  *
348c0 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 2. if that fai
348d0 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ls, and this is 
348e0 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74  a lock file (not
348f0 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65  -conch), try cre
34900 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70  ating.  ** the p
34910 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65  arent directorie
34920 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61  s and then try a
34930 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66  gain..  ** 3. if
34940 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79   that fails, try
34950 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
34960 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a  e read-only.  **
34970 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   otherwise retur
34980 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20  n BUSY (if lock 
34990 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45  file) or CANTOPE
349a0 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  N for the conch 
349b0 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75  file.  */.  pUnu
349c0 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
349d0 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46  leFd(path, openF
349e0 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e  lags);.  if( pUn
349f0 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d  used ){.    fd =
34a00 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
34a10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73  }else{.    pUnus
34a20 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
34a30 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  loc(sizeof(*pUnu
34a40 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
34a50 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
34a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
34a70 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
34a80 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
34a90 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
34aa0 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
34ab0 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
34ac0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
34ad0 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e  if( fd<0 && errn
34ae0 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73 6c  o==ENOENT && isl
34af0 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  ockfile ){.     
34b00 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74 65   if( proxyCreate
34b10 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20 3d  LockPath(path) =
34b20 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
34b30 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75         fd = robu
34b40 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
34b50 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
34b60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
34b70 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
34b80 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
34b90 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
34ba0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68  robust_open(path
34bb0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  , openFlags, 0);
34bc0 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
34bd0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  rno;.  }.  if( f
34be0 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  d<0 ){.    if( i
34bf0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
34c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34c10 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
34c20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f 29   switch (terrno)
34c30 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45 41   {.      case EA
34c40 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72 65  CCES:.        re
34c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
34c60 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49 4f  ;.      case EIO
34c70 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  : .        retur
34c80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
34c90 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68 6f  OCK; /* even tho
34ca0 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63 6f  ugh it is the co
34cb0 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65 66  nch */.      def
34cc0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 65  ault:.        re
34cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
34ce0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
34cf0 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20 3d  .  }.  .  pNew =
34d00 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71 6c   (unixFile *)sql
34d10 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
34d20 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
34d30 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a  ( pNew==NULL ){.
34d40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34d50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
34d60 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
34d70 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
34d80 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  New, 0, sizeof(u
34d90 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e 65  nixFile));.  pNe
34da0 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  w->openFlags = o
34db0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65 6d 73  penFlags;.  mems
34dc0 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20 30 2c  et(&dummyVfs, 0,
34dd0 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56 66 73   sizeof(dummyVfs
34de0 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  ));.  dummyVfs.p
34df0 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
34e00 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
34e10 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 7a  er;.  dummyVfs.z
34e20 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22 3b 0a  Name = "dummy";.
34e30 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20    pUnused->fd = 
34e40 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  fd;.  pUnused->f
34e50 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
34e60 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73 65  ;.  pNew->pUnuse
34e70 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a  d = pUnused;.  .
34e80 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69    rc = fillInUni
34e90 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c  xFile(&dummyVfs,
34ea0 20 66 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69   fd, (sqlite3_fi
34eb0 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20  le*)pNew, path, 
34ec0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
34ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
34ee0 70 70 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  ppFile = pNew;. 
34ef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34f00 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65  _OK;.  }.end_cre
34f10 61 74 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20  ate_proxy:    . 
34f20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
34f30 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  ew, fd, __LINE__
34f40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
34f50 65 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74  e(pNew);.  sqlit
34f60 65 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29  e3_free(pUnused)
34f70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34f80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34f90 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65  TEST./* simulate
34fa0 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20   multiple hosts 
34fb0 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71  by creating uniq
34fc0 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70  ue hostid file p
34fd0 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  aths */.int sqli
34fe0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d  te3_hostid_num =
34ff0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   0;.#endif..#def
35000 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ine PROXY_HOSTID
35010 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f  LEN    16  /* co
35020 6e 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64  nch file host id
35030 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 4e   length */../* N
35040 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65  ot always define
35050 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73  d in the headers
35060 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20   as it ought to 
35070 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74  be */.extern int
35080 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69   gethostuuid(uui
35090 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74  d_t id, const st
350a0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77  ruct timespec *w
350b0 61 69 74 29 3b 0a 0a 2f 2a 20 67 65 74 20 74 68  ait);../* get th
350c0 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67 65  e host ID via ge
350d0 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48 6f  thostuuid(), pHo
350e0 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74 20  stID must point 
350f0 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  to PROXY_HOSTIDL
35100 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20  EN .** bytes of 
35110 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 2e  writable memory.
35120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
35130 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75 6e  roxyGetHostID(un
35140 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48 6f  signed char *pHo
35150 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72 6f  stID, int *pErro
35160 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50 52 4f  r){.  assert(PRO
35170 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20  XY_HOSTIDLEN == 
35180 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b  sizeof(uuid_t));
35190 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49  .  memset(pHostI
351a0 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54  D, 0, PROXY_HOST
351b0 49 44 4c 45 4e 29 3b 0a 23 69 66 20 64 65 66 69  IDLEN);.#if defi
351c0 6e 65 64 28 5f 5f 4d 41 58 5f 4f 53 5f 58 5f 56  ned(__MAX_OS_X_V
351d0 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49  ERSION_MIN_REQUI
351e0 52 45 44 29 5c 0a 20 20 20 20 20 20 20 20 20 20  RED)\.          
351f0 20 20 20 20 20 26 26 20 5f 5f 4d 41 43 5f 4f 53       && __MAC_OS
35200 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  _X_VERSION_MIN_R
35210 45 51 55 49 52 45 44 3c 31 30 35 30 0a 20 20 7b  EQUIRED<1050.  {
35220 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
35230 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65  t struct timespe
35240 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20  c timeout = {1, 
35250 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d  0}; /* 1 sec tim
35260 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  eout */.    if( 
35270 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73  gethostuuid(pHos
35280 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29  tID, &timeout) )
35290 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20  {.      int err 
352a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
352b0 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
352c0 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
352d0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
352e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
352f0 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
35300 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
35310 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72  PARAMETER(pError
35320 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
35330 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
35340 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
35350 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
35360 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
35370 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
35380 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
35390 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29  hostid_num != 0)
353a0 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d  {.    pHostID[0]
353b0 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49   = (char)(pHostI
353c0 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71  D[0] + (char)(sq
353d0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
353e0 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23   & 0xFF));.  }.#
353f0 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
35400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
35410 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  /* The conch fil
35420 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68  e contains the h
35430 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61  eader, host id a
35440 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74  nd lock file pat
35450 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  h. */.#define PR
35460 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
35470 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68   2   /* 1-byte h
35480 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68  eader, 16-byte h
35490 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a  ost id, path */.
354a0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45  #define PROXY_HE
354b0 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f  ADERLEN    1   /
354c0 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61  * conch file hea
354d0 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64  der length */.#d
354e0 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48  efine PROXY_PATH
354f0 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f  INDEX    (PROXY_
35500 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f  HEADERLEN+PROXY_
35510 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69  HOSTIDLEN).#defi
35520 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  ne PROXY_MAXCONC
35530 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41  HLEN  (PROXY_HEA
35540 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53  DERLEN+PROXY_HOS
35550 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45  TIDLEN+MAXPATHLE
35560 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73  N)../* .** Takes
35570 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66   an open conch f
35580 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20  ile, copies the 
35590 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65  contents to a ne
355a0 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20  w path and then 
355b0 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63  moves .** it bac
355c0 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72  k.  The newly cr
355d0 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c  eated file's fil
355e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
355f0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a  assigned to the.
35600 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74  ** conch file st
35610 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61  ructure and fina
35620 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  lly the original
35630 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63   conch file desc
35640 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c  riptor is .** cl
35650 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a  osed.  Returns z
35660 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75  ero if successfu
35670 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
35680 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68   proxyBreakConch
35690 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
356a0 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48  File, uuid_t myH
356b0 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c  ostID){.  proxyL
356c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
356d0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
356e0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
356f0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
35700 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
35710 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
35720 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
35730 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41  char tPath[MAXPA
35740 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62  THLEN];.  char b
35750 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
35760 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63  HLEN];.  char *c
35770 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e  Path = pCtx->con
35780 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69  chFilePath;.  si
35790 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30  ze_t readLen = 0
357a0 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c  ;.  size_t pathL
357b0 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65  en = 0;.  char e
357c0 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a  rrmsg[64] = "";.
357d0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
357e0 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20   int rc = -1;.  
357f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35800 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f  (myHostID);..  /
35810 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  * create a new p
35820 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74  ath by replace t
35830 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f  he trailing '-co
35840 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61  nch' with '-brea
35850 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20  k' */.  pathLen 
35860 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c  = strlcpy(tPath,
35870 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c   cPath, MAXPATHL
35880 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c  EN);.  if( pathL
35890 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c  en>MAXPATHLEN ||
358a0 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20   pathLen<6 || . 
358b0 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50      (strlcpy(&tP
358c0 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20  ath[pathLen-5], 
358d0 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35  "break", 6) != 5
358e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
358f0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
35900 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c  (errmsg),errmsg,
35910 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e  "path error (len
35920 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c   %d)",(int)pathL
35930 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
35940 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
35950 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
35960 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
35970 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72    readLen = osPr
35980 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
35990 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58  , buf, PROXY_MAX
359a0 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
359b0 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58  if( readLen<PROX
359c0 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20  Y_PATHINDEX ){. 
359d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
359e0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
359f0 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20  g),errmsg,"read 
35a00 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c  error (len %d)",
35a10 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20  (int)readLen);. 
35a20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
35a30 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  klock;.  }.  /* 
35a40 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
35a50 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72  the temporary br
35a60 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64  eak file */.  fd
35a70 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74   = robust_open(t
35a80 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f  Path, (O_RDWR|O_
35a90 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30  CREAT|O_EXCL), 0
35aa0 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
35ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
35ac0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
35ad0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63  msg), errmsg, "c
35ae0 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64  reate failed (%d
35af0 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
35b00 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
35b10 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  ck;.  }.  if( os
35b20 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20  Pwrite(fd, buf, 
35b30 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28  readLen, 0) != (
35b40 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20  ssize_t)readLen 
35b50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
35b60 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
35b70 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
35b80 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25  "write failed (%
35b90 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
35ba0 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
35bb0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ock;.  }.  if( r
35bc0 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61  ename(tPath, cPa
35bd0 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  th) ){.    sqlit
35be0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35bf0 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d  of(errmsg), errm
35c00 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c  sg, "rename fail
35c10 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
35c20 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
35c30 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
35c40 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74  rc = 0;.  fprint
35c50 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65  f(stderr, "broke
35c60 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
35c70 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20  s\n", cPath);.  
35c80 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
35c90 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  le, conchFile->h
35ca0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63  , __LINE__);.  c
35cb0 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64  onchFile->h = fd
35cc0 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f  ;.  conchFile->o
35cd0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
35ce0 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e  R | O_CREAT;..en
35cf0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69  d_breaklock:.  i
35d00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
35d10 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   fd>=0 ){.      
35d20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b  osUnlink(tPath);
35d30 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
35d40 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f  ose(pFile, fd, _
35d50 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a  _LINE__);.    }.
35d60 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
35d70 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62  rr, "failed to b
35d80 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20  reak stale lock 
35d90 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50  on %s, %s\n", cP
35da0 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20  ath, errmsg);.  
35db0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
35dc0 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65  ../* Take the re
35dd0 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20  quested lock on 
35de0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61  the conch file a
35df0 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65  nd break a stale
35e00 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a   lock if the .**
35e10 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73   host id matches
35e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35e30 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75  proxyConchLock(u
35e40 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
35e50 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c  uuid_t myHostID,
35e60 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a   int lockType){.
35e70 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
35e80 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
35e90 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35ea0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
35eb0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
35ec0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
35ed0 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
35ee0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
35ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
35f00 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20  t nTries = 0;.  
35f10 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
35f20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20  conchModTime;.  
35f30 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68  .  memset(&conch
35f40 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65  ModTime, 0, size
35f50 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29  of(conchModTime)
35f60 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  );.  do {.    rc
35f70 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
35f80 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
35f90 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
35fa0 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
35fb0 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b  ;.    nTries ++;
35fc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35fd0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
35fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b    /* If the lock
35ff0 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a   failed (busy):.
36000 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79         * 1st try
36010 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69  : get the mod ti
36020 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c  me of the conch,
36030 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74   wait 0.5s and t
36040 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20  ry again. .     
36050 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69    * 2nd try: fai
36060 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d  l if the mod tim
36070 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73  e changed or hos
36080 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e  t id is differen
36090 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20  t, wait .       
360a0 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73  *           10 s
360b0 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ec and try again
360c0 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72  .       * 3rd tr
360d0 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  y: break the loc
360e0 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64  k unless the mod
360f0 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65   time has change
36100 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d..       */.   
36110 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
36120 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73  uf;.      if( os
36130 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  Fstat(conchFile-
36140 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
36150 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
36160 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
36170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36180 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
36190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
361a0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
361b0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
361c0 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
361d0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
361e0 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
361f0 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
36200 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
36210 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
36220 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
36230 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
36240 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
36250 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
36260 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
36270 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
36280 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
36290 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
362a0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
362b0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
362c0 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
362d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
362e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
362f0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
36300 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
36310 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
36320 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
36330 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
36340 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73      int len = os
36350 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
36360 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f  >h, tBuf, PROXY_
36370 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
36380 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
36390 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
363a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
363b0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
363c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
363d0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
363e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
363f0 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41  if( len>PROXY_PA
36400 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b  THINDEX && tBuf[
36410 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]==(char)PROXY_
36420 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20  CONCHVERSION){. 
36430 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27           /* don'
36440 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  t break the lock
36450 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
36460 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f  doesn't match */
36470 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
36480 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50  !=memcmp(&tBuf[P
36490 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c  ROXY_HEADERLEN],
364a0 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59   myHostID, PROXY
364b0 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20  _HOSTIDLEN) ){. 
364c0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
364d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
364e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
364f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36500 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65      /* don't bre
36510 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73  ak the lock on s
36520 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20 76  hort read or a v
36530 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20  ersion mismatch 
36540 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
36550 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
36560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36570 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30 30     usleep(100000
36580 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20  00); /* wait 10 
36590 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
365a0 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20  lock again */.  
365b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
365c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
365d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
365e0 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20  ries==3 );.     
365f0 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65   if( 0==proxyBre
36600 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c  akConchLock(pFil
36610 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a  e, myHostID) ){.
36620 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
36630 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
36640 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58  if( lockType==EX
36650 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
36660 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
36670 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
36680 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
36690 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
366a0 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  e, SHARED_LOCK);
366b0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
366c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
366d0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
366e0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
366f0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
36700 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
36710 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54  conchFile, lockT
36720 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ype);.        }.
36730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36740 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c  } while( rc==SQL
36750 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69  ITE_BUSY && nTri
36760 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74  es<3 );.  .  ret
36770 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
36780 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79  kes the conch by
36790 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64   taking a shared
367a0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74   lock and read t
367b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63  he contents conc
367c0 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61  h, if .** lockPa
367d0 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  th is non-NULL, 
367e0 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
367f0 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d  lock file path m
36800 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55  ust match.  A NU
36810 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  LL .** lockPath 
36820 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c  means that the l
36830 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63  ockPath in the c
36840 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
36850 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a  e used if the .*
36860 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68  * host IDs match
36870 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20  , or a new lock 
36880 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e  path will be gen
36890 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63  erated automatic
368a0 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69  ally .** and wri
368b0 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63  tten to the conc
368c0 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  h file..*/.stati
368d0 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43  c int proxyTakeC
368e0 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
368f0 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  File){.  proxyLo
36900 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
36910 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
36920 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
36930 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36940 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74  t; .  .  if( pCt
36950 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20  x->conchHeld!=0 
36960 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
36980 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
36990 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
369a0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20  ->conchFile;.   
369b0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
369c0 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72  ;.    int pError
369d0 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72   = 0;.    char r
369e0 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58  eadBuf[PROXY_MAX
369f0 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  CONCHLEN];.    c
36a00 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58  har lockPath[MAX
36a10 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  PATHLEN];.    ch
36a20 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68  ar *tempLockPath
36a30 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
36a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36a50 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43  .    int createC
36a60 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  onch = 0;.    in
36a70 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20  t hostIdMatch = 
36a80 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c  0;.    int readL
36a90 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  en = 0;.    int 
36aa0 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
36ab0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63   0;.    int forc
36ac0 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30  eNewLockPath = 0
36ad0 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41  ;.    .    OSTRA
36ae0 43 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20  CE(("TAKECONCH  
36af0 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64  %d for %s pid=%d
36b00 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
36b10 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
36b20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
36b30 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63  Path ? pCtx->loc
36b40 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61  kProxyPath : ":a
36b50 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29  uto:"), getpid()
36b60 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72  ));..    rc = pr
36b70 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48  oxyGetHostID(myH
36b80 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b  ostID, &pError);
36b90 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
36ba0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
36bb0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
36bc0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
36bd0 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ror;.      goto 
36be0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
36bf0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72     }.    rc = pr
36c00 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
36c10 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48  le, myHostID, SH
36c20 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
36c30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
36c40 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
36c50 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
36c60 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64     }.    /* read
36c70 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f   the existing co
36c80 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nch file */.    
36c90 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e  readLen = seekAn
36ca0 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
36cb0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72  )conchFile, 0, r
36cc0 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  eadBuf, PROXY_MA
36cd0 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20  XCONCHLEN);.    
36ce0 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b  if( readLen<0 ){
36cf0 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72  .      /* I/O er
36d00 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73  ror: lastErrno s
36d10 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
36d20 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  d */.      pFile
36d30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f  ->lastErrno = co
36d40 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  nchFile->lastErr
36d50 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
36d60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
36d70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
36d80 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
36d90 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65  }else if( readLe
36da0 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52  n<=(PROXY_HEADER
36db0 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
36dc0 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  LEN) || .       
36dd0 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d        readBuf[0]
36de0 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  !=(char)PROXY_CO
36df0 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  NCHVERSION ){.  
36e00 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72      /* a short r
36e10 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66  ead or version f
36e20 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d  ormat mismatch m
36e30 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
36e40 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20  create a new .  
36e50 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c      ** conch fil
36e60 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
36e70 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d     createConch =
36e80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   1;.    }.    /*
36e90 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
36ea0 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20  matches and the 
36eb0 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64  lock path alread
36ec0 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
36ed0 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27  conch.    ** we'
36ee0 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
36ef0 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66  e path there, if
36f00 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74   we can't open t
36f10 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20  hat path, we'll 
36f20 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69  .    ** retry wi
36f30 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65  th a new auto-ge
36f40 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20  nerated path .  
36f50 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a    */.    do { /*
36f60 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
36f70 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f   to try again fo
36f80 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65  r an :auto: name
36f90 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a  d lock file */..
36fa0 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74        if( !creat
36fb0 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65  eConch && !force
36fc0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  NewLockPath ){. 
36fd0 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74         hostIdMat
36fe0 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65  ch = !memcmp(&re
36ff0 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  adBuf[PROXY_HEAD
37000 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
37010 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37030 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49       PROXY_HOSTI
37040 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f  DLEN);.        /
37050 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68  * if the conch h
37060 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20  as data compare 
37070 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  the contents */.
37080 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
37090 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
370a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
370b0 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20   for auto-named 
370c0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c  local lock file,
370d0 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   just check the 
370e0 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c  host ID and we'l
370f0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l.           ** 
37100 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  use the local lo
37110 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61  ck file path tha
37120 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  t's already in t
37130 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
37140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
37150 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a   hostIdMatch ){.
37160 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
37170 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65  _t pathLen = (re
37180 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41  adLen - PROXY_PA
37190 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20  THINDEX);.      
371a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
371b0 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d     if( pathLen>=
371c0 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20  MAXPATHLEN ){.  
371d0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
371e0 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31  Len=MAXPATHLEN-1
371f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
37200 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
37210 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65  py(lockPath, &re
37220 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
37230 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29  INDEX], pathLen)
37240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
37250 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20  ckPath[pathLen] 
37260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
37270 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
37280 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
37290 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
372a0 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
372b0 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
372c0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
372d0 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63  ck path if the c
372e0 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
372f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
37300 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
37310 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37320 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
37330 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20  ostIdMatch.     
37340 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74            && !st
37350 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
37360 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64  ProxyPath, &read
37370 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
37380 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  DEX],.          
37390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373a0 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50   readLen-PROXY_P
373b0 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20  ATHINDEX).      
373c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
373d0 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64  * conch host and
373e0 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68   lock path match
373f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
37400 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
37410 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
37420 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
37430 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
37440 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65  h isn't writable
37450 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74   and doesn't mat
37460 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b  ch, we can't tak
37470 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  e it */.      if
37480 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  ( (conchFile->op
37490 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
374a0 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
374b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
374c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
374d0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
374e0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
374f0 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65     /* either the
37500 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61   conch didn't ma
37510 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74  tch or we need t
37520 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  o create a new o
37530 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ne */.      if( 
37540 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
37550 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
37560 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
37570 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c  (pCtx->dbPath, l
37580 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
37590 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LEN);.        te
375a0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
375b0 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f  kPath;.        /
375c0 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
375d0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
375e0 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63   _only_ if the c
375f0 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
37600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37610 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20        /* update 
37620 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20  conch with host 
37630 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77  and path (this w
37640 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65  ill fail if othe
37650 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
37660 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20  ** has a shared 
37670 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69  lock already), i
37680 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
37690 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62  tches, use the b
376a0 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63  ig.      ** stic
376b0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
376c0 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46    futimes(conchF
376d0 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20  ile->h, NULL);. 
376e0 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
376f0 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43  atch && !createC
37700 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
37710 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  if( conchFile->p
37720 49 6e 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69  Inode && conchFi
37730 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
37740 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  red>1 ){.       
37750 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
37760 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
37770 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
37780 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
37790 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
377a0 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
377b0 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
377c0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
377d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
377e0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
377f0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20         } else { 
37800 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
37810 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
37820 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
37830 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49  yHostID, EXCLUSI
37840 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
37850 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
37860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f  .        rc = co
37870 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
37880 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
37890 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
378a0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
378b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
378c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
378d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  OK ){.        ch
378e0 61 72 20 77 72 69 74 65 42 75 66 66 65 72 5b 50  ar writeBuffer[P
378f0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
37900 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ];.        int w
37910 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20  riteSize = 0;.  
37920 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 77        .        w
37930 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20  riteBuffer[0] = 
37940 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
37950 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20  HVERSION;.      
37960 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42    memcpy(&writeB
37970 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44  uffer[PROXY_HEAD
37980 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
37990 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
379a0 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  N);.        if( 
379b0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
379c0 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ath!=NULL ){.   
379d0 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
379e0 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
379f0 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43  Y_PATHINDEX], pC
37a00 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
37a10 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
37a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
37a30 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79           strlcpy
37a40 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52  (&writeBuffer[PR
37a50 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20  OXY_PATHINDEX], 
37a60 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41  tempLockPath, MA
37a70 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
37a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69     }.        wri
37a90 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50  teSize = PROXY_P
37aa0 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65  ATHINDEX + strle
37ab0 6e 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  n(&writeBuffer[P
37ac0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29  ROXY_PATHINDEX])
37ad0 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
37ae0 5f 66 74 72 75 6e 63 61 74 65 28 63 6f 6e 63 68  _ftruncate(conch
37af0 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74 65 53 69  File->h, writeSi
37b00 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
37b10 3d 20 75 6e 69 78 57 72 69 74 65 28 28 73 71 6c  = unixWrite((sql
37b20 69 74 65 33 5f 66 69 6c 65 20 2a 29 63 6f 6e 63  ite3_file *)conc
37b30 68 46 69 6c 65 2c 20 77 72 69 74 65 42 75 66 66  hFile, writeBuff
37b40 65 72 2c 20 77 72 69 74 65 53 69 7a 65 2c 20 30  er, writeSize, 0
37b50 29 3b 0a 20 20 20 20 20 20 20 20 66 73 79 6e 63  );.        fsync
37b60 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a  (conchFile->h);.
37b70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
37b80 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 63   created a new c
37b90 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f 74 20 6a  onch file (not j
37ba0 75 73 74 20 75 70 64 61 74 65 64 20 74 68 65 20  ust updated the 
37bb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 0a 20  contents of a . 
37bc0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 69 64          ** valid
37bd0 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c 20 74 72   conch file), tr
37be0 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 70  y to match the p
37bf0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 74 68  ermissions of th
37c00 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
37c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37c30 4b 20 26 26 20 63 72 65 61 74 65 43 6f 6e 63 68  K && createConch
37c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
37c50 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
37c60 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
37c70 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65   = osFstat(pFile
37c80 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20 20  ->h, &buf);.    
37c90 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30        if( err==0
37ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
37cb0 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20 62  mode_t cmode = b
37cc0 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49 52  uf.st_mode&(S_IR
37cd0 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53 5f  USR|S_IWUSR | S_
37ce0 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c 0a  IRGRP|S_IWGRP |.
37cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d10 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48 7c          S_IROTH|
37d20 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20 20  S_IWOTH);.      
37d30 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f 20        /* try to 
37d40 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62 61  match the databa
37d50 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72 6d  se file R/W perm
37d60 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65 20  issions, ignore 
37d70 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e 64  failure */.#ifnd
37d80 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f  ef SQLITE_PROXY_
37d90 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20 20  DEBUG.          
37da0 20 20 6f 73 46 63 68 6d 6f 64 28 63 6f 6e 63 68    osFchmod(conch
37db0 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b  File->h, cmode);
37dc0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
37dd0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
37de0 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 68 6d       rc = osFchm
37df0 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  od(conchFile->h,
37e00 20 63 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   cmode);.       
37e10 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d       }while( rc=
37e20 3d 28 2d 31 29 20 26 26 20 65 72 72 6e 6f 3d 3d  =(-1) && errno==
37e30 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 20  EINTR );.       
37e40 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
37e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
37e60 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f  int code = errno
37e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
37e80 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
37e90 22 66 63 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45  "fchmod %o FAILE
37ea0 44 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c  D with %d %s\n",
37eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37ec0 20 20 20 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f         cmode, co
37ed0 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63 6f 64  de, strerror(cod
37ee0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
37ef0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
37f00 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
37f10 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20  stderr, "fchmod 
37f20 25 6f 20 53 55 43 43 45 44 45 44 5c 6e 22 2c 63  %o SUCCEDED\n",c
37f30 6d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  mode);.         
37f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
37f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
37f60 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 65 72 72    int code = err
37f70 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  no;.            
37f80 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
37f90 22 53 54 41 54 20 46 41 49 4c 45 44 5b 25 64 5d  "STAT FAILED[%d]
37fa0 20 77 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 20   with %d %s\n", 
37fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37fc0 20 20 20 20 20 65 72 72 2c 20 63 6f 64 65 2c 20       err, code, 
37fd0 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b  strerror(code));
37fe0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
37ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
38000 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63      }.      conc
38010 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
38020 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
38030 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
38040 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
38050 20 20 20 20 20 20 0a 20 20 20 20 65 6e 64 5f 74        .    end_t
38060 61 6b 65 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20  akeconch:.      
38070 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
38080 52 4f 58 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c  ROXY: CLOSE  %d\
38090 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
380a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
380b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
380c0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 29 7b 0a 20  ->openFlags ){. 
380d0 20 20 20 20 20 20 20 69 6e 74 20 66 64 3b 0a 20         int fd;. 
380e0 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
380f0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
38100 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
38110 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  (pFile, pFile->h
38120 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
38130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
38140 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
38150 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
38160 74 5f 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50  t_open(pCtx->dbP
38170 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  ath, pFile->open
38180 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  Flags, 0);.     
38190 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 41     OSTRACE(("TRA
381a0 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25  NSPROXY: OPEN  %
381b0 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20 20 20 20  d\n", fd));.    
381c0 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
381d0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
381e0 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  ->h = fd;.      
381f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
38200 20 20 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e     rc=SQLITE_CAN
38210 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53  TOPEN_BKPT; /* S
38220 51 4c 49 54 45 5f 42 55 53 59 3f 20 70 72 6f 78  QLITE_BUSY? prox
38230 79 54 61 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65  yTakeConch calle
38240 64 0a 20 20 20 20 20 20 20 20 20 20 20 64 75 72  d.           dur
38250 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ing locking */. 
38260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
38270 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
38280 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 43 74  QLITE_OK && !pCt
38290 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a  x->lockProxy ){.
382a0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 61          char *pa
382b0 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74  th = tempLockPat
382c0 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68  h ? tempLockPath
382d0 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   : pCtx->lockPro
382e0 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
382f0 72 63 20 3d 20 70 72 6f 78 79 43 72 65 61 74 65  rc = proxyCreate
38300 55 6e 69 78 46 69 6c 65 28 70 61 74 68 2c 20 26  UnixFile(path, &
38310 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c  pCtx->lockProxy,
38320 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
38330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
38340 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
38350 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b  EM && tryOldLock
38360 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
38370 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74    /* we couldn't
38380 20 63 72 65 61 74 65 20 74 68 65 20 70 72 6f 78   create the prox
38390 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77 69 74 68  y lock file with
383a0 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69   the old lock fi
383b0 6c 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20  le path.        
383c0 20 20 20 2a 2a 20 73 6f 20 74 72 79 20 61 67 61     ** so try aga
383d0 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69  in via auto-nami
383e0 6e 67 20 0a 20 20 20 20 20 20 20 20 20 20 20 2a  ng .           *
383f0 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 63  /.          forc
38400 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31  eNewLockPath = 1
38410 3b 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 4f  ;.          tryO
38420 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ldLockPath = 0;.
38430 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
38440 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74  ue; /* go back t
38450 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c  o the do {} whil
38460 65 20 73 74 61 72 74 20 70 6f 69 6e 74 2c 20 74  e start point, t
38470 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ry again */.    
38480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
38490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
384a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
384b0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
384c0 20 61 20 63 6f 70 79 20 6f 66 20 70 61 74 68 20   a copy of path 
384d0 69 66 20 77 65 20 65 78 74 72 61 63 74 65 64 20  if we extracted 
384e0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
384f0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
38500 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20 74 68 65  onch file or the
38510 20 70 61 74 68 20 77 61 73 20 61 6c 6c 6f 63 61   path was alloca
38520 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ted on the stack
38530 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
38540 20 20 20 20 20 69 66 28 20 74 65 6d 70 4c 6f 63       if( tempLoc
38550 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20  kPath ){.       
38560 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f     pCtx->lockPro
38570 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  xyPath = sqlite3
38580 44 62 53 74 72 44 75 70 28 30 2c 20 74 65 6d 70  DbStrDup(0, temp
38590 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 20  LockPa